
package ig.metrica.escenario;

import basic.FactoryBasic;
import ejb.metrica.matriz.correlacion.MatrizCorrelacionSBBean;
import ejb.metrica.matriz.correlacion.MatrizDTO;
import ig.ejb.metrica.da.session.RelacionaccionessubcuentasDTO;
import ig.finanzas.BalanceDTO;
import ig.finanzas.RelacionesformatounidadessubcuentasbalancesDTO;
import ig.finanzas.RelacionsubcuentasproductosDTO;
import ig.metrica.ModelosDTO;
import ig.metrica.ejb.bean.Posicionesacciones;
import ig.metrica.ejb.conflujos.ConfiguracionflujosDTO;
import ig.metrica.ejb.html.GenerarHTML;
import ig.metrica.modelos.entity.ModeloorigenesdatosDTO;
import ig.metrica.riesgo.CalculoRiesgoBeanMaCor;
import ig.metrica.riesgo.ICalculoRiesgoBussines;
import ig.metrica.riesgo.ZonaDTO;
import ig.metrica.ui.confFlujos.formulada.ConFlujosFormuladosBean;
import ig.metrica.ui.confFlujos.formulada.ConFlujosFormuladosDTO;
import ig.util.Matematica;
import ig.util.VarDiversificado;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.ArrayList;
import javax.naming.NamingException;
import ig.finanzas.AccionPK;
import ig.finanzas.DefinidorCalculoCambioEsperado;
import ig.finanzas.EspeciePK;
import ig.finanzas.ManejadorBandas;
import ig.finanzas.MonedaPK;
import ig.finanzas.ProductoPK;
import ig.finanzas.TasaPK;
import ig.finanzas.riesgo.FactorRiesgoMatrizCorrelacion;
import ig.metrica.ModeloSBean;
import ig.metrica.ejb.bean.Acciones;
import ig.metrica.ejb.bean.Adicionalescontratosrenta;
import ig.metrica.ejb.bean.Contratos; 
import ig.metrica.ejb.bean.Contratossimples; 
import ig.metrica.ejb.bean.Cuentas; 
import ig.metrica.ejb.bean.Emisores; 
import ig.metrica.ejb.bean.Empresas; 
import ig.metrica.ejb.bean.Escenarios;
import ig.metrica.ejb.bean.Especies; 
import ig.metrica.ejb.bean.Flujos; 
import ig.metrica.ejb.bean.Libros; 
import ig.metrica.ejb.bean.Monedas; 
import ig.metrica.ejb.bean.Origenesdatos; 
import ig.metrica.ejb.bean.Posicionesespecies;
import ig.metrica.ejb.bean.Productos; 
import ig.metrica.ejb.bean.Relacionespeciessubcuenta; 
import ig.metrica.ejb.bean.Relacionmonedassubcuentas; 
import ig.metrica.ejb.bean.Tasas; 
import ig.metrica.ejb.bean.Tasasdepagos; 
import ig.metrica.ejb.bean.Unidadesnegocios; 
import ig.metrica.ejb.bean.Valorescontratos; 
import ig.metrica.ejb.bean.Valoresmonedas; 
import ig.metrica.ejb.bean.Valorestasas; 
import ig.metrica.liquidez.CalculoLiquidezBean;
import ig.metrica.modelos.SessionModelosBean;
import ig.metrica.riesgo.CalculoRiesgoBeanEscBan;
import ig.metrica.riesgo.CalculoRiesgoBeanMaCor_051;
import ig.metrica.riesgo.FactorRiesgoPersonalMetrica;
import ig.util.excepciones.DatoInvalidoExcepcion;
import ig.util.excepciones.LogicaExcepcion;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.Map;
import ig.util.Utilfin;
import java.util.logging.Level;
import java.util.logging.Logger;


public class GeneraEscenarioBean extends GeneraEscenarioBussines  {
    
    public String procesarEscenario(Date fecha, String modelo,String escenario, boolean debug,boolean datosActuales,ManejadorBandas bandasLiquidez,ManejadorBandas bandasRiesgo) throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception,Exception {
        this.NOMBRE_ESCENARIO=escenario;
        this.debug=debug;
        this.datosActuales=datosActuales;
        return procesarEscenario(fecha, modelo,debug,datosActuales, bandasLiquidez, bandasRiesgo);
    }
    
    /**
     *
     * Efectua el procesamiento de la Informacion Externa a Metrica, poblado de tablas MetricasDB
     * y Realizacion de Caculos (Riesgo, Rentabilidad, Liquidez).
     * @param fecha
     * @param idmodelo
     * @throws DatoInvalidoExcepcion Si la fecha o el idmodelo es nulo,
     * @throws SQLException Si se presento un error al conectarse u obtener los datos de la base de datos.
     * @throws NamingException Si se presento un error con JNDI.
     * @throws Exception Si no se pueden encontrar los objetos en el servidor de aplicaciones.
     *
     */
    public String procesarEscenario(Date fecha, String modelo,boolean debug,boolean datosActuales,ManejadorBandas bandasLiquidez,ManejadorBandas bandasRiesgo ) throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception,Exception {
        Tiempo tiempoGeneral=new Tiempo();
        this.datosActuales=datosActuales;
        try {
            this.debug=debug;
            this.cleanContadores();
            this.fechaCorte= new Timestamp(fecha.getTime());
            this.modelo=modelo;
            //Calendar calendario=Calendar.getInstance();
            //calendario.setTime(fecha);
            String DIR_HTML = getDirHTML(fecha, modelo);
            /*String DIR_HTML = modelo.trim().replaceAll(" ","_")
                    +"" 
                    + calendario.get(Calendar.YEAR)
                    +""
                    +calendario.get(Calendar.MONTH)
                    +""
                    +calendario.get(Calendar.DAY_OF_MONTH)
                    +"-"
                    +new Date().getTime();*/
            
            GenerarHTML.gewInstace().crerDirecotro(DIR_HTML);
            GenerarHTML.gewInstace().setDebug(this.debug);
           

            GenerarHTML.gewInstace().setLineasDeEspera(0);
            println("["+modelo+"]:PROCESANDO ESCENARIO"+(debug?" MODO : DEBUG":""));
            println("["+modelo+"]:Espere..");
            

            if (fecha==null && !this.datosActuales){
                println("La fecha especificada para el proceso es nula.");
                println("END_PROCESS");
                throw new DatoInvalidoExcepcion("La fecha especificada para el proceso es nula.");
            }
            
            if (modelo==null){
                println("El modelo especificado para el proceso es nulo.");
                println("END_PROCESS");
                throw new DatoInvalidoExcepcion("El modelo especificado para el proceso es nulo.");
            }
           

            modeloSBean=new ModeloSBean();
            ModelosDTO modeloDTO=modeloSBean.findByNombre(modelo.trim());
            this.idModelo = modeloDTO.getId();
            
            conn2 = getConexion("METRICADW");
            ArrayList resultados=null;
           
            try {
                String mat=getNombreMatriz();
                if (!mat.equals("")) {
                    resultados =(ArrayList) new MatrizCorrelacionSBBean().findAll();
                    if (resultados == null || resultados.size() == 0 ){
                        println("["+modelo+"]:No se encuentran registradas en el sistemas matrices de correlacion.");
                        println("END_PROCESS");
                        throw new LogicaExcepcion("["+modelo+"]:No se encuentran registradas en el sistemas matrices de correlacion. ");
                    }
                    matrizH =new MatrizCorrelacionSBBean().findById(modeloDTO.getIdmatriz());
                    
                    /*id quema'o para la matriz de correolacion mapeada en la eslaera de bandas
                     * este id es muy importante para poder cargar la matriz de choques
                     */
                    matrizDeChoques =new MatrizCorrelacionSBBean().findById(4);
                    matriz=(MatrizDTO) matrizH.get("DTO");
                }else{
                    String mensaje="ERROR:No existe relacion entre:\n" +
                            "ASOCIACIONFACTORES y el MODELO\n" +
                            "FACTORESRIESGOPERSONALES y ASOCIACIONFACTORES\n" +
                            "FACTORESRIESGO y FACTORESRIESGOPERSONALES\n" +
                            "MATRICESCORRELACION y FACTORESRIESGO\n" +
                            "Es una relacion requerida para el funcionamiento del Escenario.";
                    
                    println("["+modelo+"]:"+mensaje);
                    println("END_PROCESS");
                    throw new LogicaExcepcion("["+modelo+"]:"+mensaje);
                }
            } catch (RemoteException e) {
                println("["+modelo+"]:Problemas de Conexion."+e.toString());
                println("END_PROCESS");
                throw new LogicaExcepcion("["+modelo+"]:Problemas de Conexion."+e.toString());
            }
            
            Calendar fechaD= Calendar.getInstance();
            fechaD.setTime(fecha);
            java.sql.Date mFecha = new java.sql.Date(fecha.getYear(),fecha.getMonth(),fecha.getDate());
            java.sql.Date mFecha2 = java.sql.Date.valueOf(GenerarEscenariosUtil.getFecha(fecha,modeloDTO));
            
            println("["+modelo+"]:Fecha de Corte: "+mFecha);
            conn = getConexion("METRICADB");
            conn1 = getConexion("METRICADW");
            limpiarTablas();
            crearEscenario(fecha, modelo);
            
            ////////////////////verifica el estado de la tabla para seguir en la egeneacion de los escenarios
            if(!segruir()){
                System.out.println("["+modelo+"]:GENERACION DE ESCENARIO INTERRUMPIDO.");
                return "PROCESO_INTERRUMPIDO_POR_EL_USUARIO";
            }
            /////////////////////////////////////////////////////////////////////////////////////////////////
            
            origenesdatos  = new Origenesdatos();
            origenesdatos.setGenerarHTML(GenerarHTML.gewInstace());
            Collection OrigenDatosAll = origenesdatos.getmList();
            Iterator misOrigenes = OrigenDatosAll.iterator();
            
            Collection consulta = null;
            Collection<ModeloorigenesdatosDTO> collection=null;
            
            int contador=0;
            try {
                CConfigFlujos = GenerarEscenariosUtil.lookupConfiguracionFlujosSessionBean().findByModelo(this.idModelo);
            } catch (Exception ex) {
                ex.printStackTrace();
                println("["+modelo+"]:ERROR no se pudo cargar las configuraciones de la proyeccion de flujos: "+ex.toString());
            }
            
            
            try {
                CConFlujosFormulados=new ConFlujosFormuladosBean().findByModelo(this.idModelo);
            } catch (Exception e) {
                e.printStackTrace();
                println("["+modelo+"]:ERROR no se pudo cargando las configuraciones para proyectar flujos formulados "+e.toString());
            }
            
            try {
                /*ig.metrica.modelos.SessionModelosRemoteHome SShome=(ig.metrica.modelos.SessionModelosRemoteHome)getInitialContext().lookup("SessionModelosBean");
                ig.metrica.modelos.SessionModelosRemote sessionRemote = SShome.create();
                collection=sessionRemote.findByModelo(modeloDTO.getId());*/
                
                collection=new SessionModelosBean().findByModelo(modeloDTO.getId());
            } catch (Exception ex) {
                ex.printStackTrace();
                throw new Exception("Error tratando de hallar las relaciones entre los modelo y los origenes de datos");
            }
            
            mrelacionProductosFactores = new Hashtable();
            mrelacionMonedasFactores = new Hashtable();
            mrelacionEspeciesFactores = new Hashtable();
            while (misOrigenes.hasNext()){

                ///=======================================================
                //verifica el estado de la tabla para seguir en la egeneacion de los escenarios
                //========================================================
                if(!segruir()){
                    System.out.println("["+modelo+"]:PROCESO_INTERRUMPIDO_POR_EL_USUARIO");
                    return "PROCESO_INTERRUMPIDO_POR_EL_USUARIO";
                }
                boolean procesarOrigenDatos=false;
                element = (Origenesdatos) misOrigenes.next();
                if( element.getID()<1000 ) {
                    for (ModeloorigenesdatosDTO DTO: collection) {
                        if(element.getCONSECUTIVO()==DTO.getOrigenesdatos()){
                            procesarOrigenDatos=true;
                            break;
                        }
                    }
                }

                //===============================================================================================                
                if(procesarOrigenDatos){
                    Tiempo tiempo=new Tiempo();
                    contador++;
                    println(LINEA_LARGA+BR+"["+modelo+"]:*** Ejecutando Consulta para: "+element.getENTIDAD());
                    String QUERY=GenerarEscenariosUtil.getQUERY(element.getQUERY(),false);
                    int ocurrencias = QUERY.replace("_FECHA_CORTE","@").replace("_FECHA_INICIAL","@").split("@").length;
                    try {
                        if(!this.datosActuales){
                            if ( ocurrencias == 1  &&  !(QUERY.contains("_FECHA_CORTE") || (QUERY.contains("_FECHA_INICIAL"))))  {
                                consulta = origenesdatos.obtenerResultado(element,mFecha.toString());
                            }else{
                                consulta = origenesdatos.obtenerResultado2(element,mFecha.toString(),mFecha2.toString(),ocurrencias-1);
                            }
                        }else
                            consulta=new ArrayList();
                    /*} catch (ClassNotFoundException ex) {
                        ex.printStackTrace();*/
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    if (consulta!=null && !this.datosActuales){
                        boolean br=!( consulta.toArray().length > 0 );
                        print("Procesando "+consulta.toArray().length+" Datos para: "+element.getENTIDAD()+" ["+element.getCONSECUTIVO()+" en case "+element.getID()+"]"+(br?BR:" --> "));
                    }
                    
                    if (datosActuales || (consulta != null && consulta.toArray().length > 0)) {
                        GrabarDatos(consulta, element.getID(), element.getCONSECUTIVO());
                        Integer segundos = tiempo.getSegundos();
                        Double minutos = tiempo.getMinutos();
                        tiempo.finalizar();
                        printErroresQuery();//genera HTMLs con los errores de las consultas
                        //GenerarHTML.gewInstace().addLineaBR(mensaje);
                        println((minutos > 0 ? minutos + " Minutos en el procesamientos del origen de datos." : segundos + " Segundos en el procesamientos del origen de datos."));
                    }
                }
            }
            println(LINEA_LARGA);
            
            origenesdatos.close();            
            if(contador>0){
                Enumeration<String> enumm=this.HProductosFormulados.keys();
                if(enumm.hasMoreElements()){                    
                    println(".\n["+modelo+"]:Procesando La Confuguracion de Flujos Formuladas");                
                }
                while(enumm.hasMoreElements()){
                    String KEY=enumm.nextElement();
                    Long idProducto=HProductosFormulados.get(KEY);
                    
                    println("["+modelo+"]:Evaluando formula para el producto : "+KEY);
                    Collection CFlujos=this.getFlujosAFormular(idProducto);
                    for (Object elem1 : CFlujos) {
                        for (ConFlujosFormuladosDTO elem : this.CConFlujosFormulados) {
                            if(elem.getProducto().trim().equals(KEY) && elem.getActivo().equals(1)){
                                Double _capital=null;
                                String _fecha=null;
                                Double _interesFijo=null;
                                Double _interesVariable=null;
                                Flujos FLUJO_ACTUAL=((Flujos)elem1).getFlujos();
                                if(elem.getFormulaCapital()!=null && !elem.getFormulaCapital().trim().equals("")){
                                    String formular=GenerarEscenariosUtil.setParametros(FLUJO_ACTUAL,elem.getFormulaCapital());
                                    _capital=Double.valueOf(Matematica.evaluaExpresion(formular));
                                }
                                if(elem.getFormulaFecha()!=null && !elem.getFormulaFecha().trim().equals("")){
                                    String formular=GenerarEscenariosUtil.setParametros(FLUJO_ACTUAL,elem.getFormulaFecha());
                                    _fecha=_fecha.trim().contains("'")?_fecha.trim().substring(1,11):new Timestamp(Long.valueOf(Matematica.evaluaExpresion(formular))).toString().substring(0,10);
                                }
                                if(elem.getFormulaInteresFijo()!=null && !elem.getFormulaInteresFijo().trim().equals("")){
                                    String formular=GenerarEscenariosUtil.setParametros(FLUJO_ACTUAL,elem.getFormulaInteresFijo());
                                    _interesFijo=Double.valueOf(Matematica.evaluaExpresion(formular));
                                }
                                if(elem.getFormulaInteresVariable()!=null && !elem.getFormulaInteresVariable().trim().equals("")){
                                    String formular=GenerarEscenariosUtil.setParametros(FLUJO_ACTUAL,elem.getFormulaInteresVariable());
                                    _interesVariable=Double.valueOf(Matematica.evaluaExpresion(formular));
                                }
                                
                                FLUJO_ACTUAL.setCAPITAL(_capital);
                                FLUJO_ACTUAL.setFECHA(_fecha);
                                FLUJO_ACTUAL.setINTERESFIJO(_interesFijo);
                                FLUJO_ACTUAL.setINTERESVARIABLE(_interesVariable);
                                GrabarDatos(FLUJO_ACTUAL);
                            }
                        }
                    }
                }
                printErroresQuery();//genera HTMLs con los errores de las consultas
                //println(".\n["+modelo+"]:Se procesaron "+contador+" origenes de datos\n.");

                ////////////////////verifica el estado de la tabla para seguir en la egeneacion de los escenarios
                if(!segruir()){
                    System.out.println("["+modelo+"]:GENERACION DE ESCENARIO INTERRUMPIDO.");
                    return "PROCESO_INTERRUMPIDO_POR_EL_USUARIO";
                }
                //  GenerarEscenariosUtil.limpiarMemoria(1000);
                //  0 para Riesgo de liquidez
                //  1 para riesgo de Mercaso
                //  2 los dos
                //------------------------------------        Calculos Riesgo ----------------------------------------                
                if(modeloDTO.getTipoRiesgo()==1 || modeloDTO.getTipoRiesgo()==2){//Riesgo de Mercado es este
                    println("["+modelo+"]:*** Generando Calculos Riesgo.   Espere..");
                    try { 
                        ICalculoRiesgoBussines calculos = null;
                        if(this.matriz.getTipo().equals(0)){
                            if(modeloDTO.getTipoModelo().equals(3)){
                                //matriz de correlacion y Matriz de choques,  para la circualr 051
                                //println("Matriz de Correlaciones y Matriz de Choques [Circular 051 de 2008]");
                                calculos = new CalculoRiesgoBeanMaCor_051();
                                calculos.setZonas((Collection<ZonaDTO>) this.matrizDeChoques.get("ZONAS"));
                                calculos.setFactores(matrizH.get("FACTORES"));
                            }else{
                                //matriz de correlacion
                                //println("Matriz de Correlación");
                                calculos = new CalculoRiesgoBeanMaCor();
                            }
                        }if(this.matriz.getTipo().equals(1)){
                            println("Escalera de Bandas");
                            calculos = new CalculoRiesgoBeanEscBan();//escalera de bandas
                            calculos.setZonas((Collection<ZonaDTO>) this.matrizH.get("ZONAS"));
                        }
                        calculos.setGenerarHTML(GenerarHTML.gewInstace());                        
                        GenerarHTML.gewInstace().setLineasDeEspera(1000);
                        calculos.efectuarCalculo(fecha, bandasRiesgo ,mrelacionProductosFactores,mrelacionEspeciesFactores,mrelacionMonedasFactores);
                        println("["+modelo+"]:CALCULO DE RIESGO [  OK  ]");
                    } catch (Exception e) {
                        e.printStackTrace();
                        println("["+modelo+"]:No se pudo Hacer el CALCULO DE RIESGO:["+e.toString()+"]");
                    }finally{
                        GenerarHTML.gewInstace().setLineasDeEspera(0);
                        GenerarHTML.gewInstace().generarHTML();                        
                    }
                    
                    
                    //---------------------------------- VAR DIVERSIFICADO -----------------------------------------------
                    println(".\n["+modelo+"]:*** Actualizando empresas.   Espere..");
                    if(this.conn==null || this.conn.isClosed())
                        this.conn= getConexion("METRICADB");
                    
                    prep= conn.prepareStatement("UPDATE EMPRESAS SET VARDIVERSIFICADO = ?  WHERE ID = ?");
                    for (Empresas elem : CEmpresas ) {
                        try {
                            int calVarDIve = 1;
                            if ((modeloDTO.getTipoRiesgo() == 1 || modeloDTO.getTipoRiesgo() == 2) && modeloDTO.getTipoModelo().equals(3)) {
                                calVarDIve = 4;
                            }                            
                            Long mId = elem.getID();
                            Double varDiversificado = VarDiversificado.getVarDiversificadoParcialDB(this.conn, null, null, calVarDIve, mId, this.matriz.getId());
                            prep.setDouble(1, varDiversificado);
                            prep.setLong(2, mId);
                            prep.execute(); 
                            println("[" + modelo + "]:" + elem.getNOMBRE().trim() + " [  OK  ]");
                        } catch (Exception e) {
                            e.printStackTrace();
                            println("[" + modelo + "]:No se pudo Hacer el calculo del var divesificado para la empresa:" + elem.getNOMBRE().trim() + " [" + e.toString() + "]");
                        }
                    }
                    try {prep.close();} catch (Exception e) {}
                }

                //---------------------------------- Calculos Liquidez  ---------------------------------------------
                if(modeloDTO.getTipoRiesgo()==0 || modeloDTO.getTipoRiesgo()==2){//Riesgo de Liquidez
                    try {
                        CalculoLiquidezBean calculoliq = new CalculoLiquidezBean();
                        calculoliq.setGenerarHTML(GenerarHTML.gewInstace());
                        calculoliq.setZonas((Collection<ZonaDTO>) this.matrizH.get("ZONAS"));
                        println(LINEA_LARGA+BR+"["+modelo+"]:*** Generando Calculos Liquidez.   Espere...");
                        GenerarHTML.gewInstace().setLineasDeEspera(1000);
                        calculoliq.efectuarCalculo(fecha, bandasLiquidez , mcomportamientoAcciones);
                        println("["+modelo+"]:CALCULO DE LIQUIDEZ [  OK  ]");
                    } catch (Exception e) {
                        e.printStackTrace();
                        println("["+modelo+"]:No se pudo Hacer el calculo de Liquidez:["+e.toString()+"]");
                    }finally{
                        GenerarHTML.gewInstace().setLineasDeEspera(0);
                        GenerarHTML.gewInstace().generarHTML();
                    }
                }
                
                //--------------------------------- Calculos Rentabilidad -------------------------------------------
//            if(this.mmodelo.getTIPO_RIESGO()==0 || this.mmodelo.getTIPO_RIESGO()==0){
//                try {
//                    CalculoRentabilidadBean calculoren = new CalculoRentabilidadBean();
//                    calculoren.setGenerarHTML(generarHTML);
//                    calculoren.setZonas(this.matriz.getZonas());
//                    println(".");
//                    println("["+modelo+"]:*Generando Calculos Rentabilidad");
//                    calculoren.efectuarCalculo(mFecha2,fecha,mTipoValoracion);
//                    println("["+modelo+"]:Calculos de Rentabilidad  [  OK  ]");
//                } catch (Exception e) {
//                    calculoren.closeAll();calculoren=null;
//                    println("["+modelo+"]:No se pudo Hacer el calculo Rentabilidad:["+e.toString()+"]");
//                }
//            }

                //============================================
                // Las Consultas pra las validaciones
                //============================================
                misOrigenes = OrigenDatosAll.iterator();
                while (misOrigenes.hasNext()){
                    element = (Origenesdatos) misOrigenes.next();
                    if( element.getID() > 2000 ) {
                        for ( ModeloorigenesdatosDTO DTO: collection ) {
                            if( element.getCONSECUTIVO()==DTO.getOrigenesdatos() ){
                                println(LINEA_LARGA+BR+"["+modelo+"]:*** Ejecutando la validación : "+element.getENTIDAD());
                                String QUERY=GenerarEscenariosUtil.getQUERY(element.getQUERY(),false);
                                int ocurrencias = QUERY.replace("_FECHA_CORTE","@").replace("_FECHA_INICIAL","@").split("@").length;
                                if ( ocurrencias == 1  &&  !(QUERY.contains("_FECHA_CORTE") || (QUERY.contains("_FECHA_INICIAL"))))  {
                                    consulta = origenesdatos.obtenerResultado(element,mFecha.toString());
                                }else{
                                    consulta = origenesdatos.obtenerResultado2(element,mFecha.toString(),mFecha2.toString(),ocurrencias-1);
                                }
                                Iterator Registro  = consulta.iterator();
                                while (Registro.hasNext()) {
                                    Object[] row = (Object[]) Registro.next();
                                    StringBuilder builder = new StringBuilder();
                                    for (int i = 0; i < row.length; i++) {
                                        builder.append(row[i]+( i+1 == row.length ? "" : ", "));
                                    }
                                    println("["+modelo+"]:Error :"+builder);
                                }
                            }
                        }
                    }
                }
                //============================================

            }else{
                println("["+modelo+"]:EL MODELO EN PROCESO NO TIENE ORIGENES DE DATOS ASOCIADOS.");
            }
        } catch (NamingException e) {
            println("["+modelo+"]:Error "+e.toString());
            throw e;
        } catch (LogicaExcepcion e) {
            println("["+modelo+"]:Error "+e.toString());
            throw e;
        } catch (DatoInvalidoExcepcion e) {
            println("["+modelo+"]:Error "+e.toString());
            throw e;
        } catch (Exception e) {
            println("["+modelo+"]:Error "+e.toString());
            throw e;
        /*} catch (SQLException e) {
            println("["+modelo+"]:Error "+e.toString());
            throw e;
        } catch (Exception e) {
            println("["+modelo+"]:Error "+e.toString());
            throw e;*/
        }finally {
            try{
                DateFormat formateador = DateFormat.getTimeInstance(DateFormat.MEDIUM);
                String HoraFin = formateador.format(new Date());

                prep = conn2.prepareStatement("UPDATE ESCENARIOS SET HORAFIN=?,ESTADO=1,FECHAPROCESO=? WHERE ESTADO=0 AND (HORAFIN IS NULL)");
                prep.setString(1, HoraFin) ;
                prep.setDate(2,new java.sql.Date(Calendar.getInstance().get(Calendar.YEAR)-1900,Calendar.getInstance().get(Calendar.MONTH),Calendar.getInstance().get(Calendar.DAY_OF_MONTH)));
                prep.execute();

                try {st.close();} catch (Exception e) {}
                try {conn.close();} catch (Exception e) {}
                try {conn1.close();} catch (Exception e) {}
                try {conn2.close();} catch (Exception e) {}
                try {this.prep.close();} catch (Exception e){}
                try {this.pstmt1.close();} catch (Exception e){}
                try {this.pstmt2.close();} catch (Exception e){}
                try {this.pstmt4.close();} catch (Exception e){}
                try {this.pstmt5.close();} catch (Exception e){}
                try {this.rs.close();} catch (Exception e){}            
                Integer segundos=tiempoGeneral.getSegundos();
                Double minutos=tiempoGeneral.getMinutos();
                tiempoGeneral.finalizar();
                println("_______________________________________________________________________________\n.");            
                println("["+modelo+"]:IG-Metrica: Proceso de Calculo del Escenario en el Servidor termino en "+(minutos>0?minutos+" Minutos.":segundos+" Segundos."));
                println("END_PROCESS");
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                GenerarHTML.gewInstace().generarHTML();
                GenerarHTML.deleteInstace();                
            }
            this.cleanContadores();
        }
        this.NOMBRE_ESCENARIO=null;
        return "IG-Metrica: Proceso de generacion de Escenario finalizado..";
    }

    /**
     * Guarda la informacion que llega de las fuente s de daots
     * @param Datos
     * @param mId
     */
    private synchronized  void  GrabarDatos(Collection Datos,int mId, Integer idOrigenDeDatos){
//        ConfiguracionflujosDTO DTO=null;
        this.totalAC=totalMDA=totalACR=totalBLC=totalCTO=totalCTOS=totalESP=totalEm=totalFLJ=totalPA=totalRAP=totalRAS=totalRES=totalRFUS=totalRMS=totalTP=totalTSA=totalUN=totalVC=totalVM=totalVT=totaolPES=0;
        GenerarHTML.gewInstace().setLineasDeEspera(0);
        if(datosActuales){
            println("Procesando los datos actuales, para el Origen de Datos "+mId);
            try {
                if(!this.HOrigenesYaProcesados.containsKey(mId)){
                    Datos=GenerarEscenariosUtil.cargarDatosAtuales(mId,conn);
                    HOrigenesYaProcesados.put(mId,"ODatos");                    
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }        
        Iterator Registro=null;
        Registro = Datos.iterator();
        long id1,id2,id3,id4;
        String nom1,nom2,nom3;

        
        try {
            switch (mId) {
                case 1:
                    //NOMBRE(String), FECHA(String), VALOR(Double)
                    double valor;
                    String nombre,fecha;                    
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[]) Registro.next();
                        nombre = Reg[0].toString().trim();
                        fecha = Reg[1].toString().trim();
                        valor = Double.parseDouble(Reg[2].toString().trim());                        
                        long id_moneda=this.buscarPorNombre(2, nombre,false,"Monedas");
                        if(id_moneda==0){
                            id_moneda=++idMoneda;
                            GrabarDatos(new Monedas(idMoneda, nombre, idOrigenDeDatos));
                            MonedaPK monedaPK = new MonedaPK(nombre);
                            getTasaPKDefinidorCambioesperado(monedaPK);
                            getFactorRiesgoMatrizAsociado(monedaPK);
                            try {
                                if(frmc!=null){
//                                    monedaPK.setIdEscenario(getIdEscenario());
                                    mrelacionMonedasFactores.put(monedaPK, new FactorRiesgoPersonalMetrica(frmc, def));
                                }
                            } catch (DatoInvalidoExcepcion ex) {
                                println("[" + modelo + "]:Error Procesando:" + ex.toString());
                            }
                        }
                        if (fecha != null) {
                            GrabarDatos(new Valoresmonedas(id_moneda, fecha, valor, idOrigenDeDatos));
                        }
                    }
                    //print("DEBUG:"+totalMDA+" Monedas almacenadas.");
                    //print("DEBUG:"+totalVM+" Monedas almacenadas.");
                    break;
                case 2:
                    //NOMBRE(String), TIPO(String), MODALIDADTASA(String), NOMINALTASA(Integer)
                    int nominal;
                    String tnombre,tipo,modalidad;
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        tnombre = Reg[0].toString().trim();
                        tipo = Reg[1].toString().trim();
                        modalidad = Reg[2].toString().trim();
                        nominal = Integer.parseInt(Reg[3].toString().trim());
                        idTasas++;
                        GrabarDatos(new Tasas(idTasas,tnombre,tipo,modalidad,nominal, idOrigenDeDatos));
                    }
                    //print("DEBUG:"+totalTSA+" Tasas almacenadas.");
                    break;
                case 3:
                    //NOMBRE(String), FECHA(String), POSICION(Integer), VALOR(Double)
                    long idt=0;
                    int posicion=0;
                    String tfecha;
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        nombre = Reg[0].toString().trim();
                        idt = buscarPorNombre(1,nombre,true,"Valores Tasas");
                        if (idt!= 0) {
                            tfecha = Reg[1].toString().trim();
                            try {
                                posicion = Integer.parseInt(Reg[2].toString().trim());
                            }catch(Exception e) {
                                Long posicion1 = Math.round(Double.parseDouble(Reg[2].toString().trim()));
                                posicion =Integer.parseInt(posicion1.toString());
                            }
                            valor = Double.parseDouble(Reg[3].toString().trim());
                            GrabarDatos(new Valorestasas(idt,tfecha,posicion,valor, idOrigenDeDatos));
                        }
                    }
                    //print("DEBUG:"+totalVT+" Valores Tasas almacenadas.");
                    break;
                case 4:
                    //EMPRESA(String), UNIDAD(String)
                    String unidad;
                    String nomEmpresa="";
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        nombre = Reg[0].toString().trim();
                        unidad = Reg[1].toString().trim();
                        if (!nomEmpresa.equals(nombre)) {
                            nomEmpresa = nombre ;
                            idEmpresas++;
                            GrabarDatos(new Empresas(idEmpresas,nombre, idOrigenDeDatos));
                        }
                        idUnidadesnegocios++;
                        GrabarDatos(new Unidadesnegocios(idUnidadesnegocios,unidad,idEmpresas, idOrigenDeDatos));
                    }
                    //print("DEBUG:"+totalUN+" UnidadesNegicios almacenados.");
                    break;
                case 5:
                    //LIBRO(String), CUENTA(String), PRODUCTO(String), ACTIVO(Integer), MONEDA(String)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[]) Registro.next();
                        nom1 = Reg[0].toString().trim();
                        nom2 = Reg[1].toString().trim();
                        nom3 = Reg[2].toString().trim();
                        int activo = Integer.parseInt(Reg[3].toString().trim());
                        //hBusquedaCuentas
                        long idLibro=buscarPorNombre(7, nom1,false,"Libros");
                        if (idLibro==0) {
                            idLibros++;
                            idLibro=idLibros;
                            try {
                                GrabarDatos(new Libros(idLibros, nom1, idOrigenDeDatos));
                            } catch (Exception e) {
                                println("[" + modelo  + "]:MENSAJE TIPO 10: " + e.toString());
                            }
                        }
                        long idCuenta=buscarPorNombre(10, nom2.trim(),false,"Cuentas");
                        if (idCuenta==0) {
                            idCuentas++;
                            idCuenta=idCuentas;
                            GrabarDatos(new Cuentas(idCuentas, nom2, idLibro, idOrigenDeDatos));
                        }
                        id4 = buscarPorNombre(2, Reg[4].toString().trim(),false,"Productos");
                        long idProducto = buscarPorNombre(6, nom3,false,"Productos");
                        if (idProducto==0 && id4 != 0 ) {
                            idProductos++;
                                                          //(Long,String,int,Long,Long,Integer)
                            GrabarDatos(new Productos(idProductos, nom3, activo, id4, idCuenta, idOrigenDeDatos));
                            productoPK = new ProductoPK(nom1, nom2, nom3);

                            this.validarConFlujosFormulados(nom1.trim() + "-" + nom2.trim() + "-" + nom3.trim(), idProductos);

                            try {
                                getTasaPKDefinidorCambioesperado(productoPK);
                            } catch (Exception e) {
                                e.printStackTrace();
                                println("MENSAJE TIPO 10: " + e.toString());
                                break;
                            }
                            try {
                                getFactorRiesgoMatrizAsociado(productoPK);
                            } catch (Exception e) {
                                e.printStackTrace();
                                println("[" + modelo + "]:MENSAJE TIPO 10: " + e.toString());
                                break;
                            }
                            try {
//                                byte TIPO_FACTORTASA_DESCUENTO = 2;
//                                productoPK.setIdEscenario(getIdEscenario());           
                                if (frmc != null && tasaPK != null && tasaPK.getNombre() != null && tasaPK.getNombre().trim().equals("TIPO_FACTORTASA_DESCUENTO")) {
                                    System.out.println("productoPK:"+productoPK);
                                    mrelacionProductosFactores.put(productoPK, new FactorRiesgoPersonalMetrica(tasaPK, frmc, def, FactorRiesgoPersonalMetrica.TIPO_FACTORTASA_DESCUENTO));
                                } else if (frmc != null) {
                                    System.out.println("productoPK:"+productoPK);
                                    mrelacionProductosFactores.put(productoPK, new FactorRiesgoPersonalMetrica(tasaPK, frmc, def));
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                println("MENSAJE TIPO 10: " + e.toString());
                                break;
                            }
                        }
                    }
                    //print("DEBUG:"+totalLBR+" Libros almacenados.");
                    //print("DEBUG:"+totaCTA+" Cuentas almacenados.");
                    //print("DEBUG:"+totalPTOS+" Productos almacenados.");
                    break;

                case 6:
                    //NOMBRE(String), NIT(String)
                    while (Registro.hasNext()) {
                        idEmisores++;
                        Object[] Reg = (Object[])Registro.next();
                        nom1=Reg[0].toString().trim();
                        nom2=Reg[1].toString().trim();
                        if(nom1!=null && nom2!=null && !nom1.trim().equals("") && !nom2.trim().equals("") ){
                            GrabarDatos(new Emisores(idEmisores,nom1,nom2, idOrigenDeDatos));
                        }
                    }
                    //print("DEBUG:"+totalEmi+" Emisores almacenados.");
                    break;
                case 7:
                    // Ojo esto esta incompleto
                    //NOMBRE(String),BURSATIL(Integer), MONEDA(String), EMISOR(String)
                    mcomportamientoAcciones = new Hashtable();
                    while (Registro.hasNext()) {
                        idAcciones++;
                        
                        Object[] Reg = (Object[])Registro.next();
                        nom1=Reg[0].toString().trim();
                        id2=Integer.parseInt(Reg[1].toString().trim());
                        id3=buscarPorNombre(2,Reg[2].toString().trim(),true,"Acciones");
                        id4=buscarPorNombre(3,Reg[3].toString().trim(),true,"Acciones");
                        if(id2!=0 && id3!=0){
                            GrabarDatos(new Acciones(idAcciones,nom1,id2,id3,id4, idOrigenDeDatos));
                        }
                        mcomportamientoAcciones.put(new AccionPK(nom1),idAcciones);
                    }
                    //print("DEBUG:"+totalAC+" Acciones almacenadas.");
                    break;
                case 8:
                    //IDPOSICION(Integer), UNIDADES(Double), BURSATIL(String), ID_ACCION(String), ID_PRODUCTO(String), ID_UNIDADNEGOCIO(Integer),SALDOCONTABLE(Double), FECHAINICIO(String), TIPO(String)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        String nuevo = Reg[0].toString().trim();
                        id4 = Integer.parseInt(nuevo);
                        double unidades = Double.parseDouble(Reg[1].toString().trim());
                        nom1 = Reg[2].toString().trim();
                        id1 = buscarPorNombre(8,Reg[3].toString().trim(),true,"Pociones Acciones");
                        id3 = buscarPorNombre(6,Reg[4].toString().trim(),true,"Pociones Acciones");
                        id2 = buscarPorNombre(5,Reg[5].toString().trim(),true,"Pociones Acciones");
                        double SALDOCONTABLE=0;
                        
                        if(id1!=0 && id2!=0 && id3!=0){
                            SALDOCONTABLE=Double.parseDouble(Reg[6].toString().trim());
                            String fechaInicial=Reg[7].toString().trim();
                            double saldoMora=0;
                            int alturaMora=0;
                            GrabarDatos(new Contratos(id4,"Acciones",id3,id2,SALDOCONTABLE,fechaInicial,saldoMora,alturaMora,null,null,null,null,null, idOrigenDeDatos));
                            GrabarDatos(new Posicionesacciones(id4,unidades,id1,Reg[8].toString().trim(), idOrigenDeDatos));
                        }
                    }
                    //print("DEBUG:"+totalCTOS+" Contratos almacenados.");
                    //print("DEBUG:"+totalPA+" Posiciones Acciones almacenados.");
                    break;
                case 9:
                    //ID_CONTRATO(Integer), FECHA(String), VALOR(Double)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        id1=Integer.parseInt(Reg[0].toString().trim());
                        nom1=Reg[1].toString().trim();
                        double id8=Double.parseDouble(Reg[2].toString().trim());                        
                        id3=buscarPorNombre(9,Reg[0].toString().trim(),true,"Valores contratos");
                        if(id3!=0){
                            GrabarDatos(new Valorescontratos(id1,nom1,id8, idOrigenDeDatos));
                        }
                    }
                    //print("DEBUG:"+totalVC+" Valores Contratos almacenados.");
                    break;
                case 10:
                    //ID_CONTRATO(Integer), FECHA(String), ACCION(String),CAPITAL(Double), INTERES FIJO(Double), INTERES VARIABLE(Double), CONOCIDO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        id1=Integer.parseInt(Reg[0].toString().trim());//Integer
                                        nom1=Reg[2].toString().trim();
                        Double _id2=Double.parseDouble(Reg[3].toString().trim());//Capital
                        Double _id3=Double.parseDouble(Reg[4].toString().trim());//Interes Fijo
                        Double _id4=Double.parseDouble(Reg[5].toString().trim());//Interes Variable
                        int con=Integer.parseInt(Reg[6].toString().trim());//Conocido

                        long _idContrato=this.buscarPorNombre(9,String.valueOf(id1),true,"Flujos");
                        if(_idContrato!=0 && !ContratosSaldoProcesado.containsKey(id1)){//VERIFICO SI EL CONTRATO EN CUESTION YA FUE PROCESADO Y SU CONFIGURACION FUE SALDO CAPITAL
                            GrabarDatos(new Flujos(id1,Reg[1].toString().trim(),_id2,_id3,_id4,con,0, idOrigenDeDatos));//GUARDAMOS EL NUEVO FLUJO
                        }
                    }
                    //print("DEBUG:"+totalFLJ+" Flujos Contratos almacenados.");
                    break;                    
                case 11:
                    //ID_CONTRATO(Integer), FECHA(String), CAPITAL(Double), INTERESFIJO(Double), INTERESVARIABLE(Double), CONOCIDO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        id1=Integer.parseInt(Reg[0].toString().trim());
                                        nom1=Reg[1].toString().trim();
                        Double _id2=Double.parseDouble(Reg[2].toString().trim());
                        Double _id3=Double.parseDouble(Reg[3].toString().trim());
                        Double _id4=Double.parseDouble(Reg[4].toString().trim());
                        int con=Integer.parseInt(Reg[5].toString().trim());
                        // int mIDCONTRATO,String mFECHA,double mCAPITAL,double mINTERESFIJO,double mINTERESVARIABLE,int mCONOCIDO 
                        long _idContrato=this.buscarPorNombre(9,String.valueOf(id1),true,"Flujos");
                        if(_idContrato !=0 && !ContratosSaldoProcesado.containsKey(id1)){//VERIFICO SI EL CONTRATO EN CUESTION YA FUE PROCESADO Y SU CONFIGURACION FUE SALDO CAPITAL
                            GrabarDatos(new Flujos(id1,nom1,_id2,_id3,_id4,con,0, idOrigenDeDatos));//GUARDAMOS EL NUEVO FLUJO
                        }
                    }
                    break;
                case 12:
                    //ISIN(String), NOMBRE(String), MONEDA(String), EMISOR(String)
                    while (Registro.hasNext()) {
                        idEspecies++;
                        Object[] Reg = (Object[])Registro.next();
                        nom1=Reg[0].toString().trim();
                        nom2=Reg[1].toString().trim();
                        long idmon=buscarPorNombre(2,Reg[2].toString().trim(),true,"Especie");
                        long idemi=buscarPorNombre(3,Reg[3].toString().trim(),true,"Especie");
                        Double _id2=Double.valueOf(Reg[4].toString().trim());//OJO
                        int id33=Integer.parseInt(Reg[5].toString().trim());
                        int id44=Integer.parseInt(Reg[6].toString().trim());

                        if(idmon!=0 && idemi!=0){
                            try {
                                EspeciePK especiePK = new EspeciePK( nom1.trim());
                                try {
                                    getTasaPKDefinidorCambioesperado(especiePK);
                                } catch (Exception e) {
                                    println("["+modelo+"]:MENSAJE TIPO 10: "+e.toString());
                                    break;
                                }
                                try {
                                    getFactorRiesgoMatrizAsociado(especiePK) ;
                                } catch (Exception e) {
                                    println("["+modelo+"]:MENSAJE TIPO 10: "+e.toString());
                                    break;
                                }
//                                especiePK.setIdEscenario(getIdEscenario());
                                if (tasaPK.getNombre()==null && frmc!=null){
                                    GrabarDatos(new Especies(idEspecies,nom1,nom2,_id2,id33,id44,idmon,idemi, idOrigenDeDatos));
                                    mrelacionEspeciesFactores.put( especiePK, new FactorRiesgoPersonalMetrica(frmc, def) );
                                }else if(frmc!=null){
                                    GrabarDatos(new Especies(idEspecies,nom1,nom2,_id2,id33,id44,idmon,idemi, idOrigenDeDatos));
                                    mrelacionEspeciesFactores.put( especiePK, new FactorRiesgoPersonalMetrica(tasaPK,frmc, def) );
                                }else{
                                    println("DEBUG:La Especie ["+nom1.trim()+"] No esta parametrizada en el modelo : "+modelo);
                                }
                            } catch (Exception e) {
                                println("["+modelo+"]:MENSAJE TIPO 10: Llenando mrelacionEspeciesFactores "+e.toString());
                            }
                        }
                    }
                    break;
                case 13:
                    //POSICION(Integer), VALORNOMINAL(Double), TIPO(String), ISIN(String), PRODUCTO(String),
                    //UNIDADNEGOCIO(String), SALDOCONTABLE(Double), FECHAINICIAL(String), SALDOMORA(Double),
                    //ALTURAMORA(Integer), TASADESCUENTO(Double), FECHAVENCIMIENTO(String),FORMACALCULOCONTRATO(Integer)
                    //VALORCUOTA(Double), VALORNOMINAL(Double), PROYECTAR(Integer)

                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                                 id4=Integer.parseInt(Reg[0].toString().trim());
                        double id5=Double.parseDouble(Reg[1].toString().trim());
                                                 nom1=Reg[2].toString().trim();
                                id1=buscarPorNombre(4,Reg[3].toString().trim(),true,"Posiciones Especies");
                                id3=buscarPorNombre(6,Reg[4].toString().trim(),true,"Posiciones Especies");
                                id2=buscarPorNombre(5,Reg[5].toString().trim(),true,"Posiciones Especies");
                        double SALDOCONTABLE=0;
                        if(id1!=0 && id2!=0 && id3!=0){
                            SALDOCONTABLE=Double.parseDouble(Reg[6].toString().trim());
                            String fechaInicial=Reg[7].toString().trim();
                            double saldoMora=Double.parseDouble(Reg[8].toString().trim());
                            int alturaMora=Integer.parseInt(Reg[9].toString().trim());
                            double tasaDeDescuento=Double.parseDouble(Reg[10].toString().trim());                            
                            String fechaVencimiento=Reg[11].toString().trim();                  //fecha de vencimiento
                            Integer formaCalculo=Integer.valueOf(Reg[12].toString().trim());    //forma de calculo del contrato
                            Double valorActual=Double.parseDouble(Reg[13].toString().trim());   //valor cuota actual del contrato//VALOR_DE_LA_CUOTA
                            Double valorNominal=Double.parseDouble(Reg[14].toString().trim());  //valor nominal del contrato
                            Integer proyectar=Integer.valueOf(Reg[15].toString().trim());       //si se proyecta
                            //Se envia 2 en el parametro CUOTA_O_FECHA(Integer) para que el calculo de los fujos lo haga por fecha
                            Contratos contrato = new Contratos(id4,"Especies",id3,id2,SALDOCONTABLE,fechaInicial,saldoMora,alturaMora,fechaVencimiento,formaCalculo,valorActual,valorNominal,proyectar,2, idOrigenDeDatos);
                            if (GrabarDatos(contrato)){
                                GrabarDatos(new Posicionesespecies(id4,id5,nom1,id1,tasaDeDescuento, idOrigenDeDatos));
                                //Agregado para que se llene la coleccion con las posiciones que requieren generar flujos futuros 08-09-2010
                                if(!ContratosParaProyectarFlujos.containsKey(id4) && proyectar.equals(1)){
                                    ContratosParaProyectarFlujos.put(id4,contrato);
                                }
                            }
                        }
                    }
                    break;
                case 14:
                    //ISIN(String), FECHA(String), VALOR(Double)
                    // OR
                    //IDCONTRATO(Integer), FECHA(String), VALOR(Double)
                    try {
                        while (Registro.hasNext()) {
                            Object[] Reg = (Object[]) Registro.next();                            
                            try {
                                //===============================
                                //Esto para evaluar si es el id del contrato o un isin
                                //Lanza un aexception si es un ISIN y lo procesa el catch (Exception)                                
                                id4 = Integer.valueOf(Reg[0].toString().trim());
                                //===============================

                                nom1 = Reg[1].toString().trim();
                                double id8 = Double.parseDouble(Reg[2].toString().trim());
                                try {
                                    GrabarDatos(new Valorescontratos(id4, nom1, id8, idOrigenDeDatos));
                                } catch (Exception ex) {
                                    println("[" + modelo + "]:Error ::" + ex.getMessage());
                                }
                            } catch (Exception e) {
                                Long[]  resultado=null;
                                long id_busqueda=buscarPorNombre(4, Reg[0].toString().trim(),true,"Valores contrato");
                                nom1 = Reg[1].toString().trim();
                                if(id_busqueda!=0){
                                    resultado=buscarPorNombreRetornaVarios(id_busqueda);
                                }else{
                                    resultado=new Long[0];
                                }
                                double id8 = Double.parseDouble(Reg[2].toString().trim());
                                if (resultado.length>0) {
                                    for (int i = 0; i < resultado.length; i++) {
                                        try {
                                            Long integer = resultado[i];
                                            GrabarDatos(new Valorescontratos(integer, nom1, id8, idOrigenDeDatos));
                                        } catch (Exception ex) {
                                            println("[" + modelo + "]:Error ::" + ex.getMessage());
                                        }
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        println("[" + modelo + "]:Error ::" + e.getMessage());
                    } finally {
                        try {pstmt5.close();pstmt5 = null;} catch (Exception e) {}                        
                    }
                    break;
                case 15:
                    //ISIN(String), FECHA(String), CAPITAL(Double), INTERES FIJO(Double), INTERES VARIABLE(Double), CONOCIDO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[]) Registro.next();
                        long _id = buscarPorNombre(4, Reg[0].toString().trim(),true,"Flujos");
                        if (_id != 0) {
                            id1 = buscarPosicionesEspeciePorIdEspecie(_id,"Flujo");
                            if (id1 != 0) {
                                nom1 = Reg[1].toString().trim();
                                Double _id2 = Double.valueOf(Reg[2].toString().trim());
                                Double _id3 = Double.valueOf(Reg[3].toString().trim());
                                Double _id4 = Double.valueOf(Reg[4].toString().trim());
                                int con = Integer.parseInt(Reg[5].toString().trim());
                                //grabar de una muere el metodo procesar Flujos
                                long _idContrato = this.buscarPorNombre(9, String.valueOf(id1),true,"Flujos");
                                if (_idContrato != 0 && !ContratosSaldoProcesado.containsKey(id1)) {//VERIFICO SI EL CONTRATO EN CUESTION YA FUE PROCESADO Y SU CONFIGURACION FUE SALDO CAPITAL                                
                                    GrabarDatos(new Flujos(id1, nom1, _id2, _id3, _id4, con, 0, idOrigenDeDatos));//GUARDAMOS EL NUEVO FLUJO
                                }
                            }
                        }
                    }
                    break;
                case 16:
                    //Se modifica a solicitud de eliecer, para que no se busquen las posiciones especies si no que se guarde directamente
                    //ID_CONTRATO(Integer), FORMA(Integer), SPREAD(Double), FECHAINICIO(String), FECHAFIN(String), MODALIDADSPREAD(String), NOMINALSPREAD(Integer), MODALIDADPAGO(String), NOMINALPAGO(Integer), TASA(String), LIQUIDAFINDEPERIODO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[]) Registro.next();
                        id1 = this.buscarPorNombre(9, Reg[0].toString().trim(),true,"Tasa de Pago"); //ID DEL CONTRATO
                        if (id1 != 0) {
                            int id22 = Integer.parseInt(Reg[1].toString().trim()); //FORMA
                            double id8 = Double.parseDouble(Reg[2].toString().trim()); //SPREAD
                            nom1 = Reg[3].toString().trim(); //FECHA INICIO
                            nom2 = Reg[4].toString().trim(); //FECHA FIN
                            nom3 = Reg[5].toString().trim(); //MODALIDAD SPREAD
                            int id44 = Integer.parseInt(Reg[6].toString().trim()); //NOMINAL SPREAD
                            String nom4 = Reg[7].toString().trim(); //MODALIDAD PAGO
                            int id5 = Integer.parseInt(Reg[8].toString().trim()); //NOMINAL PAGO
                            long id6 = buscarPorNombre(1, Reg[9].toString().trim(),true,"Tasa de Pago"); //ID DE LA TASA
                            if (id6 != 0) {
                                int id7 = Integer.parseInt(Reg[10].toString().trim()); //LIQUIDAFINDEPERIODO
                                if (id1 != 0 && id6 != 0) {
                                                                             //Long, int, double,String,String,String , int , String, int , Long, int , Integer
                                    Tasasdepagos tasasdepagos = new Tasasdepagos(id1, id22, id8, nom1, nom2, nom3, id44, nom4, id5, id6, id7, idOrigenDeDatos);
                                    GrabarDatos(tasasdepagos);
                                    if (this.ContratosParaProyectarFlujos.containsKey(id1)) {

                                        //se toma el contrato del hashtable
                                        Contratos contrato = ContratosParaProyectarFlujos.get(id1);
                                        Calendar calendar = Calendar.getInstance();
                                        calendar.setTimeInMillis(java.sql.Date.valueOf(tasasdepagos.getFECHAFIN().substring(0, 10).trim()).getTime());

                                        //se busca la tasa catual -metodo
                                        Double valorTasa = getValorTasa(tasasdepagos);
                                        if(valorTasa == null){
                                           valorTasa = tasasdepagos.getSPREAD();
                                        }
                                        try {
                                            Collection<Flujos> CFlujos = GenerarEscenariosUtil.proyectarFlujo(tasasdepagos, contrato, valorTasa, this.fechaCorte);
                                            for (Flujos elem : CFlujos) {
                                                this.GrabarDatos(elem);
                                            }
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                            println("[" + modelo + "]:MENSAJE DE TIPO 11: Al proyectar los flujos del contrato " + id1 + " : \n   " + e.getMessage());
                                        }
                                        //elimino el contrato del Hashtable para que NO proyecte nuevamente
                                        this.ContratosParaProyectarFlujos.remove(id1);
                                    }
                                }
                            }
                        }
                    }
                    break;                    
                case 17:
                    //POSICION(Integer), FECHA(String), CAPITAL(Double), INTERESFIJO(Double), INTERESVARIABLE(Double), CONOCIDO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        id1=Integer.parseInt(Reg[0].toString().trim());
                        nom1=Reg[1].toString().trim();
                        double id5=Double.parseDouble(Reg[2].toString().trim());
                        double id6=Double.parseDouble(Reg[3].toString().trim());
                        double id7=Double.parseDouble(Reg[4].toString().trim());
                        int con=Integer.parseInt(Reg[5].toString().trim());                        
                        long _idContrato=this.buscarPorNombre(9,String.valueOf(id1),true,"Flujos");
                        if(_idContrato!=0 && !ContratosSaldoProcesado.containsKey(id1)){//VERIFICO SI EL CONTRATO EN CUESTION YA FUE PROCESADO Y SU CONFIGURACION FUE SALDO CAPITAL
                            GrabarDatos(new Flujos(id1,nom1,id5,id6,id7,con,0, idOrigenDeDatos));//GUARDAMOS EL NUEVO FLUJO
                        }
                        //procesarFlujos(id1,(Timestamp) Reg[1], id5,id6,id7,con);
                        //GrabarDatos(new Flujos(id1,nom1,id5,id6,id7,con));
                    }
                    break;
                case 18:
                    //NOMBRE(String), TIPO(String), ID_CONTRATO(Integer), PRODUCTO(String), UNIDADNEGOCIO(String), EMISOR(String),
                    //SALDOCONTABLE(Double),FECHAINICIAL(String), SALDOMORA(Double), ALTURAMORA(Integer), FECHAVENCIMIENTO(String),
                    //FORMACALCULOCONTRATO(Integer), VALORCUOTA(Double), VALORNOMINAL(Double), PROYECTAR(Integer), TASADESCUENTO(Double), CUOTA_O_FECHA(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        nom2=Reg[0].toString().trim();                  //nombre para contrato simple
                        nom1=Reg[1].toString().trim();                  //tipo para el contrato simple
                        id4=Integer.parseInt(Reg[2].toString().trim()); //id del contrato
                        id2=buscarPorNombre(6,Reg[3].toString().trim(),true,"Contratos Simples");//id del producto
                        id1=buscarPorNombre(5,Reg[4].toString().trim(),true,"Contratos Simples");//id del la unidad de negocio
                        id3=buscarPorNombre(3,Reg[5].toString().trim(),true,"Contratos Simples");//id del emisor
                        double SALDOCONTABLE=Double.parseDouble(Reg[6].toString().trim());  //saldo contable para el contrato
                        String fechaInicial=Reg[7].toString().trim();                       //fecha Inicial
                        double saldoMora=Double.parseDouble(Reg[8].toString().trim());      //saldo de la mora
                        int alturaMora=Integer.parseInt(Reg[9].toString().trim());          //altura mora
                        
                        String fechaVencimiento=Reg[10].toString().trim();                  //fecha de vencimiento
                        Integer formaCalculo=Integer.valueOf(Reg[11].toString().trim());    //forma de calculo del contrato
                        Double valorActual=Double.parseDouble(Reg[12].toString().trim());   //valor cuota actual del contrato//VALOR_DE_LA_CUOTA
                        Double valorNominal=Double.parseDouble(Reg[13].toString().trim());  //valor nominal del contrato
                        Integer proyectar=Integer.valueOf(Reg[14].toString().trim());       //si se proyecta
                        Double TASA_DESCUENTO=Double.valueOf(Reg[15].toString().trim());    //tasa de descuento
                        Integer CUOTA_OR_FECHA=null;
                        try{
                            CUOTA_OR_FECHA=Integer.valueOf(Reg[16].toString().trim());   //VALOR DE LA CUOTA
                        }catch(Exception e){}
                        long _idContrato=this.buscarPorNombre(9,String.valueOf(id4),false,"Contratos Simples");
                        long idContratoSimpleBuscado = this.buscarPorNombre(11,String.valueOf(id4),false,"Contratos Simples");
                        if(id1!=0 && id2!=0 && id3!=0 && idContratoSimpleBuscado==0){
                            Contratos contrato=new Contratos(id4,"ContratosSimples",id2,id1,SALDOCONTABLE,fechaInicial,saldoMora,alturaMora,fechaVencimiento,formaCalculo,valorActual,valorNominal,proyectar,CUOTA_OR_FECHA, idOrigenDeDatos);
                            //boolean isSave=true;
                            if(_idContrato==0 && GrabarDatos(contrato)){
                                //procesar los flujos
                                procesarFlujos(id4);
                                GrabarDatos(new Contratossimples(id4,nom2,nom1,id3,TASA_DESCUENTO, idOrigenDeDatos));
                                if(!ContratosSaldoProcesado.containsKey(id4) && proyectar.equals(1)){
                                    ContratosSaldoProcesado.put(id4,true);
                                    ContratosParaProyectarFlujos.put(id4,contrato);
                                }
                            }
                        }else if( idContratoSimpleBuscado != 0 ){
                             printDebug("Ya existe un Contrato Simple con el mismo nombre.");
                        }
                    }
                    break;
                case 19:
                    //ID_CONTRATO(Integer), FECHA(String), CAPITAL(Double), INTERESFIJO(Double), INTERESVARIABLE(Double), CONOCIDO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        id1=Integer.parseInt(Reg[0].toString().trim());
                        nom1=Reg[1].toString().trim();
                        if(!nom1.contains("-")){
                            if(Integer.valueOf(nom1.substring(4,6))>12){
                                throw new Exception("Fecha mal formada: yyyy-mm-dd, yyyymmdd "+nom1);
                            }
                            if(Integer.valueOf(nom1.substring(6,8))>31){
                                throw new Exception("Fecha mal formada: yyyy-mm-dd, yyyymmdd "+nom1);
                            }
                            nom1=nom1.substring(0,4)+"-"+nom1.substring(4,6)+"-"+nom1.substring(6,8);
                        }
                        double id5=Double.parseDouble(Reg[2].toString().trim());
                        double id6=Double.parseDouble(Reg[3].toString().trim());
                        double id7=Double.parseDouble(Reg[4].toString().trim());
                        int con=Integer.parseInt(Reg[5].toString().trim());
                        long _idContrato=this.buscarPorNombre(9,String.valueOf(id1),true,"Flujos");
                        if(_idContrato!=0 && !ContratosSaldoProcesado.containsKey(id1)){//VERIFICO SI EL CONTRATO EN CUESTION YA FUE PROCESADO Y SU CONFIGURACION FUE SALDO CAPITAL

                            ////OJO QUITAR DESPUES, FUE UN DESARROLLO RAPIDO PARA EL FESTIVO DEL 12 DE ENERO
                            Calendar c = Calendar.getInstance();
                            c.setTime(java.sql.Date.valueOf(nom1.substring(0, 10).trim()));
                            if (c.get(Calendar.MONTH) == 0 && c.get(Calendar.DAY_OF_MONTH) == 12  ) {
                                //c.add(Calendar.DAY_OF_MONTH,1);
                            }
                            nom1=c.get(Calendar.YEAR)+"-"+(c.get(Calendar.MONTH)<=8?"0":"")+(c.get(Calendar.MONTH)+1)+"-"+(c.get(Calendar.DAY_OF_MONTH)<=9?"0":"")+c.get(Calendar.DAY_OF_MONTH);
                            ////END

                            GrabarDatos(new Flujos(id1,nom1,id5,id6,id7,con,0, idOrigenDeDatos));//GUARDAMOS EL NUEVO FLUJO
                        }
//                        grabar de una muere el metodo procesar Flujos
//                        validar si el contrato ya fue procesad
                    }
                    break;
                case 20:
                    //ID_CONTRATO(Integer), FORMA(Integer), SPREAD(Double), FECHAINICIO(String), FECHAFIN(String), MODALIDADSPREAD(String),
                    //NOMINALMODALIDADSPREAD(Integer), MODALIDADPAGO(String), NOMINALMODALIDADPAGO(Integer), TASA(String), LIQUIDAFINDEPERIODO(Integer)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();                        
                        int id22=Integer.parseInt(Reg[1].toString().trim());
                        double id8=Double.parseDouble(Reg[2].toString().trim());
                        nom1=Reg[3].toString().trim();
                        nom2=Reg[4].toString().trim();
                        nom3=Reg[5].toString().trim();
                        int id44 = Integer.parseInt(Reg[6].toString().trim());
                        String nom4=Reg[7].toString().trim();
                        int id5 = Integer.parseInt(Reg[8].toString().trim());
                        //int id6 = Integer.parseInt(Reg[9].toString().trim());
                        long id6 = buscarPorNombre(1, Reg[9].toString().trim(),true,"Tasas de Pago");//id de la tasa
                        id1 = buscarPorNombre(9, Reg[0].toString().trim(),true,"Tasa de pago");//id del contrato
                        int id7 = Integer.parseInt(Reg[10].toString().trim());
                        if (id6 != 0 && id1!=0) {
                                                                         //Long, int, double,String,String,String , int , String, int , Long, int , Integer
                            Tasasdepagos tasasdepagos = new Tasasdepagos(id1, id22, id8, nom1, nom2, nom3, id44, nom4, id5, id6, id7, idOrigenDeDatos);
                            GrabarDatos(tasasdepagos);

                            //public Tasasdepagos(int mIDCONTRATO, int mFORMA, double mSPREAD, String mFECHAINICIO, String mFECHAFIN, String mMODALIDADSPREAD, int mNOMINALMODALIDADSPREAD, String mMODALIDADPAGO, int mNOMINALMODALIDADPAGO, int mIDTASAREFERENCIA, int mLIQUIDAFINDEPERIODO)

                            if (this.ContratosParaProyectarFlujos.containsKey(id1)) {

                                //se toma el contrato del hashtable
                                Contratos contrato = ContratosParaProyectarFlujos.get(id1);
                                Calendar calendar = Calendar.getInstance();
                                calendar.setTimeInMillis(java.sql.Date.valueOf(tasasdepagos.getFECHAFIN().substring(0, 10).trim()).getTime());

                                //Variables temporales
                                //                            Long fechaFin=java.sql.Date.valueOf(tasasdepagos.getFECHAFIN().substring(0,10).trim()).getTime();
                                //                            Long fechaInicio=java.sql.Date.valueOf(tasasdepagos.getFECHAINICIO().substring(0,10).trim()).getTime();

                                //se busca la tasa catual -metodo
                                Double valorTasa = getValorTasa(tasasdepagos);
                                try {
                                    Collection<Flujos> CFlujos = GenerarEscenariosUtil.proyectarFlujo(tasasdepagos, contrato, valorTasa, this.fechaCorte);
                                    for (Flujos elem : CFlujos) {
                                        this.GrabarDatos(elem);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    println("[" + modelo + "]:MENSAJE DE TIPO 11: Al proyectar los flujos del contrato " + id1 + " : \n   " + e.getMessage());
                                }
                                //elimino el contrato del Hashtable para que NO proyecte nuevamente
                                this.ContratosParaProyectarFlujos.remove(id1);
                            }
                        }
                    }
                    break;
                case 21:
                    //CONTRATO(Integer),TIRCOMPRA(Duoble),TIRVALORACION(Double),VALORAFECHA1(Double),VALORAFECHA2(Double),VALORTIRAFECHA1(Double),VALORTIRAFECHA2(Double)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        String nuevo = Reg[0].toString().trim();
                        id1=Integer.parseInt(nuevo);
                        double mTircompra = Double.parseDouble(Reg[1].toString().trim());
                        double mTirvaloracion = Double.parseDouble(Reg[2].toString().trim());
                        double mValorafecha1 = Double.parseDouble(Reg[3].toString().trim());
                        double mValorafecha2 = Double.parseDouble(Reg[4].toString().trim());
                        double mValoraTirfecha1 = Double.parseDouble(Reg[5].toString().trim());
                        double mValoraTirfecha2 = Double.parseDouble(Reg[6].toString().trim());
                        GrabarDatos(new Adicionalescontratosrenta(id1,mTircompra,mTirvaloracion,mValorafecha1,mValorafecha2,mValoraTirfecha1,mValoraTirfecha2, idOrigenDeDatos));
                    }
                    break;
                case 22:
                    //ISIN(String),TIPO(String),FORMATO(Integer),UNIDAD_DE_CAPTURA(String),SUBCUENTA(String),SALDOCONTABLE(Duoble)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        int id11=Integer.parseInt(Reg[2].toString().trim());
                        double saldocon = Double.parseDouble(Reg[5].toString().trim());
                        GrabarDatos(new Relacionespeciessubcuenta(Reg[0].toString().trim(),Reg[1].toString().trim(),id11,Reg[3].toString().trim(),Reg[4].toString().trim(),saldocon, idOrigenDeDatos));
                    }
                    break;
                case 23:
                    //NOMBREMONEDA(String),FORMATO(Integer),UNIDAD_DE_CAPTURA(String),SUBCUENTA(String),POSICIONACTIVA(Double),POSICIONPASIVA(Double)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        int id11=Integer.parseInt(Reg[1].toString().trim());
                        double posicion1=Double.parseDouble(Reg[4].toString().trim());
                        double posicion2=Double.parseDouble(Reg[5].toString().trim());
                        GrabarDatos(new Relacionmonedassubcuentas(Reg[0].toString().trim(),id11,Reg[2].toString().trim(),Reg[3].toString().trim(),posicion1,posicion2, idOrigenDeDatos));
                    }
                   break;
                case 24:
                    //PUC(Integer),VALOR(Double),MODEDA(String),PRODUCTO(String),UNIDADESNEGOCIO(String)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        Integer posicion0=Integer.parseInt(Reg[0].toString().trim());
                        Double  posicion1=Double.parseDouble(Reg[1].toString().trim());
                        long posicion2=this.buscarPorNombre(2,Reg[2].toString().trim(),true,"Balance");//busco el id por nombre de la moneda
                        long posicion3=this.buscarPorNombre(6,Reg[3].toString().trim(),true,"Balance");//busco el id por nombre del producto
                        long posicion4=this.buscarPorNombre(5,Reg[4].toString().trim(),true,"Balance");//busco el id por nombre de la unidad de negocio por
                        String emisor=Reg[5].toString().trim();
                        if(posicion2!=0 && posicion3!=0 && posicion4!=0){
                            GrabarDatos(new BalanceDTO(posicion0,posicion1,posicion2,posicion3,posicion4,emisor, idOrigenDeDatos));
                        }
                    }
                    break;
                case 25:
                    //ID_BALANCE(Integer),FORMATO(Integer),UNIDAD_DE_CAPTURA(String),SUBCUENTA(String)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        Long posicion0=Long.parseLong(Reg[0].toString().trim());
                        Long posicion1=Long.valueOf(Reg[1].toString().trim());
                        String posicion2=Reg[2].toString().trim();
                        String posicion3=Reg[3].toString().trim();
                        GrabarDatos(new RelacionesformatounidadessubcuentasbalancesDTO(posicion0,posicion1,posicion2,posicion3, idOrigenDeDatos));
                    }
                    break;
                case 26:
                    //FORMATO(Integer), UNIDAD_DE_CAPTURA(String), SUBCUENTA(String), ID_PRODUCTO(String)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        Long IDFORMATO=Long.parseLong(Reg[0].toString().trim());
                        String UNIDADDECAPTURA=Reg[1].toString().trim();
                        String SUBCUENTA=Reg[2].toString().trim();
                        long IDPRODUCTO = this.buscarPorNombre(6,Reg[3].toString().trim(),true,"Relacion subcuentas productos");//busco el id por nombre del producto
                        if(IDPRODUCTO!=0){
                            GrabarDatos(new RelacionsubcuentasproductosDTO(IDFORMATO,UNIDADDECAPTURA,SUBCUENTA,IDPRODUCTO, idOrigenDeDatos));
                        }
                    }
                    break;
                case 27:
                    //FORMATO(Integer),UNIDAD_DE_CAPTURA(String),SUBCUENTA(String),ID_ACCION(String)
                    while (Registro.hasNext()) {
                        Object[] Reg = (Object[])Registro.next();
                        Long IDFORMATO=Long.parseLong(Reg[0].toString().trim());
                        String UNIDADDECAPTURA=Reg[1].toString().trim();
                        String SUBCUENTA=Reg[2].toString().trim();
                        long IDACCION=buscarPorNombre(8,Reg[3].toString().trim(),true,"Relacion acciones subcuentas");
                        if(IDACCION!=0){
                            GrabarDatos(new RelacionaccionessubcuentasDTO(IDFORMATO,UNIDADDECAPTURA,SUBCUENTA,IDACCION, idOrigenDeDatos));
                        }
                    }
                    break;
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
            println("["+modelo+"]:Error El Origen de datos "+mId+" no se puede convertir un dato. "+e);
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
            println("["+modelo+"]:Error: \n" +
                    " El Origen de datos "+mId+" espera mas campos.\n" +
                    " O se esta tratando de hacer un sub-string con una rango demaciado a una linea de cararteres.\n" +
                    ""+e);
        } catch (NullPointerException e) {
            //e.printStackTrace();
            println("["+modelo+"]:Error El Origen de datos "+mId+" uno e los valores que llega es nulo ."+e);
        } catch (Exception e) {
            e.printStackTrace();
            println("["+modelo+"]:Error El Origen de datos "+mId+"."+e);
        }
    }


    private Collection getFlujosAFormular(Long idProducto)throws Exception{
        Collection CFlujos=new ArrayList();
        Flujos FLUJO_ACTUAL=null;
        String QueryFlujos="SELECT IDCONTRATO, FECHA, CAPITAL, INTERESFIJO, INTERESVARIABLE, CONOCIDO, FORMULADO, IDORIGENDATO FROM FLUJOS FL " +
                "INNER JOIN CONTRATOS CO ON CO.ID=FL.IDCONTRATO " +
                "INNER JOIN PRODUCTOS PR ON CO.IDPRODUCTO=PR.ID AND PR.ID = ?";
        this.pstmt5=this.conn.prepareStatement(QueryFlujos);
        this.pstmt5.setLong(1,idProducto);
        this.rs=this.pstmt5.executeQuery();

        while(this.rs.next() || true){
            FLUJO_ACTUAL=new Flujos(1L,"2006-01-01",2000.0,0.25,0.25,1,1, rs.getInt("IDORIGENDATO"));//test
            CFlujos.add(FLUJO_ACTUAL);
            break;
        }
        return CFlujos;
    }
    

    public Long buscarPosicionesEspeciePorIdEspecie(long idEspecie, String source) {
        long mRes = 0;
        String varSqlSelect = "Select * from Posicionesespecies Where IDESPECIE=?";
        try {
            prep = conn.prepareStatement(varSqlSelect);
            prep.setLong(1, idEspecie);
            rs = prep.executeQuery();
            if (rs.next()) {
                mRes = rs.getLong("ID");
            }
        } catch (Exception e) {
            println("[" + modelo + "]:DaoPosicionesespecies.BuscarporIDPESPECIE:" + e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                prep.close();
            } catch (Exception ex) {
            }
            try {
                rs.close();
            } catch (Exception ex) {
            }
        }
        if (mRes == 0) {
            String key = ("DEBUG:No pudo encontrar el ID [" + idEspecie + "] de la especie, en Posicionesespecies, almacenado "+source);
            println(key);
        }
        return mRes;
    }

    public Long[] buscarPorNombreRetornaVarios(long idEspecie) {
        Long[] datos=new Long[0];
        if(hP.containsKey(idEspecie)){
            return hP.get(idEspecie);
        }
        String varSqlSelect = "Select ID from Posicionesespecies Where IDESPECIE=?";
        ResultSet res = null;
        Collection<Long> c=new ArrayList<Long>();
        try {
            if(pstmt5==null){
                pstmt5 = conn.prepareStatement(varSqlSelect);
            }
            pstmt5.setLong(1, idEspecie);
            res = pstmt5.executeQuery();
            while(res.next()){
                c.add(res.getLong("ID"));
            }
            datos=new Long[c.size()];
            int i=0;
            for (Long integer : c) {
                datos[i++]=integer;
            }
        } catch (Exception e) {
            println("[" + modelo + "]: Advertencia buascando en Posicionesespecies:" + e.getMessage());
            e.printStackTrace();
        }
        if (res == null) {
            String key = ("DEBUG:No se pudo encontrar el ID [" + idEspecie + "] de la especie, en Posicionesespecies, almacenado Valorescontratos");
            println(key);
        }
        hP.put(idEspecie,datos);
        return datos;
        //return res;
    }

    private String getNombreMatriz() throws NamingException, SQLException {
        String mIdmatriz = "";
        try {
            String varSqlSelect =
                    "select distinct mr.nombre from modelos m " +
                    "inner join ASOCIACIONFACTORES a on m.id=a.idmodelo " +
                    "inner join FACTORESRIESGOPERSONALES f on a.idfactorriesgopersonal=f.id " +
                    "inner join FACTORESRIESGO fr on f.IDFACTORMATRIZ=fr.id " +
                    "inner join MATRICESCORRELACION mr on fr.idmatriz=mr.id where m.id=?";
            prep = conn2.prepareStatement(varSqlSelect);
            prep.setInt(1, this.idModelo);
            rs = prep.executeQuery();
            if (rs.next()) {
                mIdmatriz = rs.getString("nombre");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
            } catch (Exception e) {
            }
            try {
                prep.close();
            } catch (Exception e) {
            }
        }
        return mIdmatriz;
    }

    private void getTasaPKDefinidorCambioesperado(ProductoPK productoPK) throws NamingException, SQLException {
        String varSqlSelect = "";
        varSqlSelect = "SELECT IDFACTORRI" +
                "ESGOPERSONAL FROM ASOCIACIONFACTORES WHERE ENTIDAD = ? AND IDMODELO = ?";
        prep = conn2.prepareStatement(varSqlSelect);
        prep.setString(1, productoPK.toString());
        prep.setInt(2, this.idModelo);
        rs = prep.executeQuery();
        tasaPK = null;
        def=null;
        if (rs.next()) {
            varSqlSelect = "SELECT * FROM FACTORESRIESGOPERSONALES WHERE ID = ?";
            Integer idfactor = rs.getInt("IDFACTORRIESGOPERSONAL");
            prep.close();
            prep = conn2.prepareStatement(varSqlSelect);
            prep.setInt(1, idfactor);
            rs = prep.executeQuery();
            if (rs.next()) {
                tasaPK = new TasaPK(rs.getString("tasa"));
                ////////////
                varSqlSelect = "SELECT * FROM CAMBIOSESPERADOS WHERE ID = ?";
                Integer idCambioEsperado = rs.getInt("IDCAMBIOESPERADO");
                prep.close();
                prep = conn2.prepareStatement(varSqlSelect);
                prep.setInt(1, idCambioEsperado);
                rs.close();
                rs = prep.executeQuery();
                ////////////
                rs.next();
                Integer tipodef = null;
                try {
                    tipodef = rs.getInt("FORMACALCULO");
                } catch (Exception e) {
                    tipodef = -1;
                }
                try {
                    switch (tipodef) {
                        case 1:
                            def = new DefinidorCalculoCambioEsperado(rs.getDouble("VALOR"));
                            break;
                        case 2:
                            def = new DefinidorCalculoCambioEsperado(rs.getDouble("LAMBDA"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), rs.getByte("tipodiferencia"), rs.getInt("longperiodo"));
                            break;
                        case 3:
                            def = new DefinidorCalculoCambioEsperado(rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"));
                            break;
                        case 4:
                            def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), true);
                            break;
                        case 5:
                            def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), false);
                            break;

                        case 6:
                            def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), null);
                            break;

                        /*
                         * Cristhiam Reina
                         * 5 De Agosto del 20011
                         * Case 8 ingresado
                         * 
                         */
                        case 8:
                            def = new DefinidorCalculoCambioEsperado(rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), rs.getByte("tipodiferencia"), rs.getInt("longperiodo"));       
                            break;
                    }
                } catch (DatoInvalidoExcepcion e) {
                    e.printStackTrace();
                    println("[" + modelo + "]:Error Procesando el Definidor de Cambio Esperado" + e.toString());
                }
            }
        }
        try {
            rs.close();
        } catch (Exception ex) {
        }
        try {
            prep.close();
        } catch (Exception ex) {
        }
    }
    
    private void getTasaPKDefinidorCambioesperado(MonedaPK monedaPK)  {

        try {
            String varSqlSelect = "select f.* from ASOCIACIONFACTORES a inner join FACTORESRIESGOPERSONALES f on a.idfactorriesgopersonal=f.id " +
                    "where a.idmodelo=? and entidad=?";

            prep = conn2.prepareStatement(varSqlSelect);
            prep.setInt(1, this.idModelo);
            prep.setString(2, monedaPK.toString());
            rs = prep.executeQuery();
            if (rs.next()) {
                tasaPK = new TasaPK(rs.getString("tasa"));
            }
            prep.close();
            String varSqlSelect1 = "select c.* from ASOCIACIONFACTORES a inner join FACTORESRIESGOPERSONALES f on a.idfactorriesgopersonal=f.id " +
                    "inner join CAMBIOSESPERADOS c on f.IDCAMBIOESPERADO=c.ID where a.idmodelo=? and entidad=?";
            prep = conn2.prepareStatement(varSqlSelect1);
            prep.setInt(1, this.idModelo);
            prep.setString(2, monedaPK.toString());
            rs = prep.executeQuery();
            def = null;
            if (rs.next()) {
                int tipodef = rs.getInt("FORMACALCULO");
                try {
                    switch (tipodef) {
                        case 1:
                            def = new DefinidorCalculoCambioEsperado(rs.getDouble("VALOR"));
                            break;
                        case 2:
                            def = new DefinidorCalculoCambioEsperado(rs.getDouble("LAMBDA"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), rs.getByte("tipodiferencia"), rs.getInt("longperiodo"));
                            break;
                        case 3:
                            def = new DefinidorCalculoCambioEsperado(rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"));
                            break;
                        case 4:
                            def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), true);
                            break;
                        case 5:
                            def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), false);
                            break;

                        case 6:
                        def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), null);

                        break;

                        /*
                         * Cristhiam Reina
                         * 5 De Agosto del 2011
                         * Case 8 ingresado
                         *
                         */

                        case 8:
                            def = new DefinidorCalculoCambioEsperado(rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), rs.getByte("tipodiferencia"), rs.getInt("longperiodo"));
                            break;
                    }
                } catch (DatoInvalidoExcepcion e) {
                    e.printStackTrace();
                    println("[" + modelo + "]:Error Procesando:" + e.toString());
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            println("[" + modelo + "]:Error Procesando el Definidor de Cambio Esperado" + ex.toString());
        } finally {
            try {
                rs.close();
            } catch (Exception ex) {
            }
            try {
                prep.close();
            } catch (Exception ex) {
            }
        }
    }

    private void getTasaPKDefinidorCambioesperado(EspeciePK especiePK) throws NamingException, SQLException {
        String varSqlSelect = "select f.* from ASOCIACIONFACTORES a inner join FACTORESRIESGOPERSONALES f on a.idfactorriesgopersonal=f.id " +
                "where a.idmodelo=? and entidad=?";
        prep = conn2.prepareStatement(varSqlSelect);
        prep.setInt(1, this.idModelo);
        prep.setString(2, especiePK.toString());
        rs = prep.executeQuery();
        if (rs.next()) {
            tasaPK = new TasaPK(rs.getString("tasa"));
        }

        String varSqlSelect1 = "select c.* from ASOCIACIONFACTORES a inner join FACTORESRIESGOPERSONALES f on a.idfactorriesgopersonal=f.id " +
                "inner join CAMBIOSESPERADOS c on f.IDCAMBIOESPERADO=c.ID where a.idmodelo=? and entidad=?";
        prep.close();
        prep = conn2.prepareStatement(varSqlSelect1);
        prep.setInt(1, this.idModelo);
        prep.setString(2, especiePK.toString());
        rs = prep.executeQuery();
        def = null;
        if (rs.next()) {
            int tipodef = rs.getInt("FORMACALCULO");
            try {
                switch (tipodef) {
                    case 1:
                        def = new DefinidorCalculoCambioEsperado(rs.getDouble("VALOR"));
                        break;
                    case 2:
                        def = new DefinidorCalculoCambioEsperado(rs.getDouble("LAMBDA"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), rs.getByte("tipodiferencia"), rs.getInt("longperiodo"));
                        break;
                    case 3:
                        def = new DefinidorCalculoCambioEsperado(rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"));
                        break;
                    case 4:
                        def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), true);
                        break;
                    case 5:
                        def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), false);
                        break;

                    case 6:
                        def = new DefinidorCalculoCambioEsperado(rs.getByte("tipodiferencia"), rs.getInt("longperiodo"), rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), null);

                        break;

                    case 8:
                            def = new DefinidorCalculoCambioEsperado(rs.getInt("numobservaciones"), rs.getDouble("coeficienteconfianza"), rs.getByte("tipodiferencia"), rs.getInt("longperiodo"));
                            break;
                }
            } catch (DatoInvalidoExcepcion e) {
                e.printStackTrace();
                println("[" + modelo + "]:Error Procesando el Definidor de Cambio Esperado" + e.toString());
            }
        }
        try {
            rs.close();
        } catch (Exception ex) {
        }
        try {
            prep.close();
        } catch (Exception ex) {
        }
    }

    private void getFactorRiesgoMatrizAsociado(EspeciePK especiePK) throws NamingException, SQLException {
        String varSqlSelect = " SELECT FACTORESRIESGO.NOMBRE AS Factor " +
                "FROM MODELOS M INNER JOIN ASOCIACIONFACTORES ON M.ID = ASOCIACIONFACTORES.IDMODELO " +
                "INNER JOIN " +
                "FACTORESRIESGOPERSONALES ON ASOCIACIONFACTORES.IDFACTORRIESGOPERSONAL = FACTORESRIESGOPERSONALES.ID INNER JOIN " +
                "FACTORESRIESGO ON FACTORESRIESGOPERSONALES.IDFACTORMATRIZ = FACTORESRIESGO.ID " +
                "WHERE (M.ID = ? ) and (ASOCIACIONFACTORES.ENTIDAD = ? ) ";
        prep = conn2.prepareStatement(varSqlSelect);
        prep.setInt(1, this.idModelo);
        prep.setString(2, especiePK.getNombre());
        rs = prep.executeQuery();
        frmc=null;
        if (rs.next()) {
            try {
                for (Object elem : (Collection) matrizH.get("FACTORES")) {
                    if (((FactorRiesgoMatrizCorrelacion) elem).getNombre().trim().equals(rs.getString("Factor").trim())) {
                        frmc = ((FactorRiesgoMatrizCorrelacion) elem);
                        break;
                    }
                }
            } catch (Exception e) {
            }
        }
        try {
            rs.close();
        } catch (Exception ex) {
        }
        try {
            prep.close();
        } catch (Exception ex) {
        }

    }

    private void getFactorRiesgoMatrizAsociado(MonedaPK monedaPK) /*throws NamingException, SQLException*/ {
        String varSqlSelect = " SELECT FACTORESRIESGO.NOMBRE AS Factor " +
                "FROM MODELOS M INNER JOIN ASOCIACIONFACTORES ON M.ID = ASOCIACIONFACTORES.IDMODELO " +
                "INNER JOIN " +
                "FACTORESRIESGOPERSONALES ON ASOCIACIONFACTORES.IDFACTORRIESGOPERSONAL = FACTORESRIESGOPERSONALES.ID INNER JOIN " +
                "FACTORESRIESGO ON FACTORESRIESGOPERSONALES.IDFACTORMATRIZ = FACTORESRIESGO.ID " +
                "WHERE (M.ID = ? ) and (ASOCIACIONFACTORES.ENTIDAD = ? ) ";
        try {
            prep = conn2.prepareStatement(varSqlSelect);
            prep.setInt(1, this.idModelo);
            prep.setString(2, monedaPK.getNombre());
            rs = prep.executeQuery();
            frmc=null;
            if (rs.next()) {
                try {
                    for (Object elem : (Collection) matrizH.get("FACTORES")) {
                        if (((FactorRiesgoMatrizCorrelacion) elem).getNombre().trim().equals(rs.getString("Factor").trim())) {
                            frmc = ((FactorRiesgoMatrizCorrelacion) elem);
                            break;
                        }
                    }
                } catch (Exception e) {
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            println("[" + modelo + "]:Error Procesando: " + ex.toString());
        }
        try {
            rs.close();
        } catch (Exception ex) {
        }
        try {
            prep.close();
        } catch (Exception ex) {
        }
    }

    /**
     * Crea el encabezado del escenario para la Fecha y el modelo dado.
     * @param fecha - Fecha de generacion de Escenario.
     * @param idmodelo - Modelo sobre el que se genera el Escenario.
     * @throws DatoInvalidoExcepcion Si la fecha o el idmodelo es nulo,
     * @throws SQLException Si se presento un error al conectarse u obtener los datos de la base de datos.
     * @throws NamingException Si se presento un error con JNDI.
     * @throws Exception Si no se pueden encontrar los objetos en el servidor de aplicaciones.
     */
    public void crearEscenario(Date fecha, String modelo) throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception {

        try {
            DateFormat formateador = DateFormat.getTimeInstance(DateFormat.MEDIUM);
            Timestamp tsFecha = new Timestamp(fecha.getTime());

            String HoraIni = formateador.format(new Date());
            prep = conn2.prepareStatement("SELECT ID FROM MODELOS WHERE NOMBRE=?");
            prep.setString(1, modelo);

            rs = prep.executeQuery();
            if (rs.next()) {
                int Id_Modelo = rs.getInt("ID");
                prep.close();
                prep = conn2.prepareStatement("SELECT MAX(ID)+1 AS MAXIMO FROM ESCENARIOS");
                rs = prep.executeQuery();
                rs.next();
                IdEscenario = rs.getInt("MAXIMO");
                if (IdEscenario == 0) {
                    IdEscenario = 1;
                }
                prep.close();
                prep = conn2.prepareStatement("Insert into Escenarios(ID,NOMBRE,IDMODELO,HORAINICIO,FECHA,ESTADO) values(?,?,?,?,?,?)");
                prep.setInt(1, IdEscenario);
                if (NOMBRE_ESCENARIO != null) {
                    println("[" + modelo + "]NOMBRE_ESCENARIO:" + NOMBRE_ESCENARIO);
                    prep.setString(2, NOMBRE_ESCENARIO);
                } else {
                    println("[" + modelo + "]NOMBRE_ESCENARIO:Escenario " + IdEscenario);
                    prep.setString(2, "Escenario " + IdEscenario);
                }

                prep.setInt(3, Id_Modelo);
                prep.setString(4, HoraIni);
                prep.setTimestamp(5, tsFecha);
                prep.setInt(6, 0);
                prep.execute();
                
                GenerarHTML.gewInstace().setIdEscenario(IdEscenario);
                
            } else {
                println("[" + modelo + "]Problemas con el Modelo: " + modelo);
                GenerarHTML.gewInstace().generarHTML();
                throw new Exception("[" + modelo + "]Problemas con el Modelo: " + modelo);
            }
        } catch (Exception e) {
            e.printStackTrace();
            println("[" + modelo + "]MENSAJE TIPO 10: " + e.toString());
        } catch (Throwable e) {
            e.printStackTrace();
            println("[" + modelo + "]MENSAJE TIPO 10: " + e.toString());
            
        } finally {
            try {
                rs.close();
            } catch (Exception ex) {
            }
            try {
                prep.close();
            } catch (Exception ex) {
            }
        }
    }
  
    public Escenarios getEscenario() throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception {
        Escenarios escenarios = null;
        try {
            conn = getConexion("METRICADW");
            prep = conn.prepareStatement("SELECT * FROM ESCENARIOS WHERE ESTADO <=?");
            prep.setInt(1, 1);
            rs = prep.executeQuery();
            while (rs.next()) {
                escenarios = new Escenarios(rs.getInt("ID"), rs.getString("NOMBRE"), rs.getInt("IDMODELO"), rs.getString("HORAINICIO"), rs.getString("HORAFIN"), rs.getString("FECHA"), rs.getInt("ESTADO"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (Exception e) {
                }
            }
            if (prep != null) {
                try {
                    prep.close();
                } catch (Exception e) {
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                }
            }
        }
        return escenarios;
    }

    public Boolean segruir() {
        ResultSet resultado = null;
        try {
            if (conn2 == null) {
                conn2 = getConexion("METRICADW");
            }
            prep = conn2.prepareStatement("SELECT ESTADO FROM ESCENARIOS WHERE ID=?");
            prep.setInt(1, IdEscenario);
            resultado = prep.executeQuery();
            if (resultado.next()) {
                int estado = resultado.getInt("ESTADO");
                if (estado == 3) {
                    if (rs != null) {
                        this.rs.close();
                    }
                    resultado.close();
                    if (conn != null && !conn.isClosed()) {
                        conn.close();
                    }
                    println("[" + modelo + "]:-----------------------------------");
                    println("[" + modelo + "]:PROCESO_INTERRUMPIDO_POR_EL_USUARIO");
                    println("[" + modelo + "]:-----------------------------------");
                    GenerarHTML.gewInstace().generarHTML();
                    return false;
                }
            }
        } catch (NamingException ex) {
            ex.printStackTrace();
            System.out.println("No se pudo verificar el estado del escenario" + ex.getMessage());
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("No se pudo verificar el estado del escenario" + ex.getMessage());
        } finally {
            try {
                resultado.close();
            } catch (Exception e) {
            }
            try {
                prep.close();
            } catch (Exception ex) {
            }
            try {
                this.origenesdatos.close();
            } catch (Exception e) {
            }            
        }
        return true;
    }

    /**
     * Posibles valores
     *  0 Procesando
     *  1 Finalizo
     *  2 Guardado
     *  3 Cancelado
     */
    public Boolean pararEscenario(String modelo)throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception {
        System.out.println("[ IG-METRICA ]:INTERRUMPIENDO LA GENERACION ESCENARIO...");
        int ESTADO=0;
        Connection conn3 = null;
        ResultSet resultado=null;
        try {
            conn3 = getConexion("METRICADW");
            int contador=1;
            while(contador<=21){
                try {
                    prep = conn3.prepareStatement("SELECT ID FROM ESCENARIOS WHERE ESTADO=?");
                    break;
                } catch (Exception e) {
                    System.out.println("Intento por interrumpir escenario fallido "+contador);
                    if(contador==21)
                        return false;
                    contador++;
                    try{
                        Thread.sleep(1000);
                    } catch (Exception ex) {}
                }
            }
            
            prep.setInt(1,ESTADO);
            resultado=prep.executeQuery();
            int id=-1;
            if(resultado.next()){
                id=resultado.getInt("ID");
            }else{
                if(id==-1){
                    ESTADO=1;
                    prep.close();
                    resultado.close();
                    prep = conn3.prepareStatement("SELECT ID FROM ESCENARIOS WHERE ESTADO=?");
                    prep.setInt(1,ESTADO);
                    resultado=prep.executeQuery();
                    if(resultado.next()){
                        id=resultado.getInt("ID");
                    }
                }
            }
            
            if(id==-1){
                System.out.println("[ IG-METRICA ]:NO SE PUDO ENVIAR EL MENSAJE PARA INTERRUMPIR ESCENARIO");
                return false;
            }else if(ESTADO==1){
                String[] a={""};
                throw new LogicaExcepcion("No se puede cancelar una genreaci\u00F3n de escenarios finalizados.",new String[]{"Espere el mensaje de finalizaci\u00F3n."});
            }
            this.cancelarStatement();//Cancela todos preparestatement.
            prep = conn3.prepareStatement("UPDATE ESCENARIOS SET ESTADO=? WHERE ESTADO=? AND ID=?");
            prep.setInt(1,3);
            prep.setInt(2,ESTADO);
            prep.setInt(3,id);
            prep.executeUpdate();
            System.out.println("[ IG-METRICA ]:MENSAJE PARA INTERRUMPIR LA GENERACION ESCENARIO, ENVIADO");
            return true;
        } catch (NamingException ex) {
            ex.printStackTrace();
            return false;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }finally {
            try{resultado.close();} catch (Exception ex) {}
            try{prep.close();} catch (Exception ex) {}
            try{conn3.close();} catch (Exception ex) {}
        }
    }
    
    /**
     * Devuelve un Escenario segun una Fecha y un modelo dado.
     * y Realizacion de Caculos (Riesgo, Rentabilidad, Liquidez).
     * @param fecha - Fecha de generacion de Escenario.
     * @param idmodelo - Modelo sobre el que se genera el Escenario.
     * @throws DatoInvalidoExcepcion Si la fecha o el idmodelo es nulo,
     * @throws SQLException Si se presento un error al conectarse u obtener los datos de la base de datos.
     * @throws NamingException Si se presento un error con JNDI.
     * @throws Exception Si no se pueden encontrar los objetos en el servidor de aplicaciones.
     */
    public Escenarios getEscenario(Date fecha, String modelo)throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception {
        
        Escenarios escenarios=null;
        try {
            conn = getConexion("METRICADW");
            prep = conn.prepareStatement("SELECT ID FROM MODELOS WHERE NOMBRE=?");
            prep.setString(1, modelo);
            rs = prep.executeQuery();
            if (rs.next()){
                int Id_Modelo = rs.getInt("ID");
                prep.close();
                prep = conn.prepareStatement("SELECT * FROM ESCENARIOS WHERE (Idmodelo = ?) AND (Fecha=?)");
                prep.setInt(1, Id_Modelo);
                prep.setString(2, fecha.toString());
                rs = prep.executeQuery();
                if(rs.next()){
                    escenarios = new Escenarios(rs.getInt("ID"),rs.getString("Nombre"),rs.getInt("Idmodelo"),rs.getString("HoraInicio"),rs.getString("Horafin"),rs.getString("Fecha"),rs.getInt("Estado"));
                }
            }else{
                println("["+modelo+"]:Problemas con el Modelo: "+modelo);
                throw new Exception("Problemas con el Modelo: "+modelo);
            }
        } catch (Exception e) {
            println("Error "+e.toString());
        }finally{
            try { rs.close(); } catch (Exception e) {}
            try { prep.close(); } catch (Exception e) {}
            try { conn.close(); } catch (Exception e) {}
        }
        return escenarios;
    }
    
    public Integer getEscenario(String modelo,String nombre){
        PreparedStatement ps = null;
        Escenarios registro =null;
        ResultSet r = null;
        try {
            conn = getConexion("METRICADW");
            prep = conn.prepareStatement("SELECT ID FROM MODELOS WHERE NOMBRE=?");
            prep.setString(1, modelo);
            rs = prep.executeQuery();
            if (rs.next()){
                int Id_Modelo = rs.getInt("ID");
                String query = "SELECT * FROM ESCENARIOS WHERE NOMBRE=? AND IDMODELO=?";                
                ps = conn.prepareStatement(query);
                ps.setString(1,nombre);
                ps.setInt(2,Id_Modelo);
                r = ps.executeQuery();
                if(r.next()){
                    registro = new Escenarios();
                    registro.setID(r.getInt("ID"));
                    registro.setNOMBRE(r.getString("NOMBRE"));
                }
            }
            if(registro!=null)
                return registro.getID();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {            
            try {prep.close();} catch (Exception e) {}
            try {r.close();} catch (Exception e) {}
            try {ps.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
            try {this.rs.close();} catch (Exception e){}
        }
        return null;
    }
    
    private void getFactorRiesgoMatrizAsociado(ProductoPK productoPK) throws NamingException, SQLException{
        String varSqlSelect =" SELECT FACTORESRIESGO.NOMBRE AS Factor " +
                "FROM MODELOS M INNER JOIN ASOCIACIONFACTORES ON M.ID = ASOCIACIONFACTORES.IDMODELO " +
                "INNER JOIN " +
                "FACTORESRIESGOPERSONALES ON ASOCIACIONFACTORES.IDFACTORRIESGOPERSONAL = FACTORESRIESGOPERSONALES.ID INNER JOIN " +
                "FACTORESRIESGO ON FACTORESRIESGOPERSONALES.IDFACTORMATRIZ = FACTORESRIESGO.ID " +
                "WHERE (M.ID = ? ) and (ASOCIACIONFACTORES.ENTIDAD = ? ) " ;
        prep = conn2.prepareStatement(varSqlSelect);
        prep.setInt(1,this.idModelo);
        prep.setString(2,productoPK.toString());
        rs = prep.executeQuery();
        frmc=null;
        if(rs.next()) {
            try {
                for (Object elem : (Collection)matrizH.get("FACTORES")){
                    if(((FactorRiesgoMatrizCorrelacion)elem).getNombre().trim().equals(rs.getString("Factor").trim())){
                        frmc = ((FactorRiesgoMatrizCorrelacion)elem);
                        break;
                    }
                }
            } catch (Exception e) {}
        }
        try {
            prep.close();
        } catch (Exception e) {}
    }
    
    private Contratos findContratoById(long id) throws SQLException {
        try {
            
            String varSqlSelect =" SELECT * FROM CONTRATOS WHERE ID = ?" ;
            prep = conn.prepareStatement(varSqlSelect);
            prep.setLong(1,id);
            rs = prep.executeQuery();
            //ID, TIPO, IDPRODUCTO, IDUNIDADNEGOCIO, SALDOCONTABLE, FECHAINICIAL, SALDOMORA, ALTURAMORA
        } catch (Exception e) {
            try {
                if(prep !=null)prep .close();
                if(rs!=null)rs.close();
            } catch (Exception ex) {
            }
        }
        Contratos contratos = new Contratos();
        
        if(rs.next()){
            contratos.setID(rs.getLong("ID"));
            contratos.setTIPO(rs.getString("TIPO"));
            contratos.setIDPRODUCTO(rs.getLong("IDPRODUCTO"));
            contratos.setIDUNIDADNEGOCIO(rs.getLong("IDUNIDADNEGOCIO"));
            contratos.setSALDOCONTABLE(rs.getDouble("SALDOCONTABLE"));
            contratos.setFECHAINICIAL(rs.getString("FECHAINICIAL"));
            contratos.setSALDOMORA(rs.getDouble("SALDOMORA"));
            contratos.setALTURAMORA(rs.getInt("ALTURAMORA"));
            contratos.setFechaVencimiento(rs.getString("FECHA_VENCIMI"));
            contratos.setFormaCalculo(rs.getInt("FORMA_CALCULO"));
            contratos.setValorActual(rs.getDouble("VALORC_ACTUAL"));
            contratos.setValorNominal(rs.getDouble("VALOR_NOMINAL"));
            contratos.setProyectar(rs.getInt("PROYECTAR"));
        }
        try {
            if(prep !=null)prep .close();
            if(rs!=null)rs.close();
        } catch (Exception e) {
            
        }
        return contratos;
    }
    
    /**
     *Retorna la configuracion que se ajusta a la altura menor que, pero mallor entre los que cumplen
     */
    private ConfiguracionflujosDTO getCofifuracionFlujosDTO(int alturaMora) {
        Collection<ConfiguracionflujosDTO> CC= new ArrayList<ConfiguracionflujosDTO>();
        for (ConfiguracionflujosDTO DTO: this.CConfigFlujos){
            boolean adicionar=true;
            if(alturaMora<=DTO.getAltura()){
                for (ConfiguracionflujosDTO _DTO: CC){
                    if(_DTO.equals(DTO))
                        adicionar=false;
                }
                if(adicionar)//no existe en la collection
                    CC.add(DTO);
            }
        }
        ConfiguracionflujosDTO dto=null;
        for (ConfiguracionflujosDTO elem : CC) {
            try {
                if(dto.getAltura()>elem.getAltura())
                    dto=elem;
            } catch (Exception e) {
                dto=elem;
            }
        }
        return dto;
    }
    
    private void procesarFlujos(long id1) {
        try {
            Contratos contratos= this.findContratoById(id1);            //BUSCO EL CONTRATO RELACIONADO CON EL FLUJO
            if(contratos!=null && contratos.getALTURAMORA()!=null && contratos.getALTURAMORA()>0){     //VERIFICO SI EL CONTRATO TIENE ALTURA MAYOR QUE 0
                ConfiguracionflujosDTO DTO=this.getCofifuracionFlujosDTO(contratos.getALTURAMORA());//LA CONFIGURACIONE DE FLUJOS QUE CUMPLAN CON LA CONDICION
                if(DTO!=null){                                    //VERIFICO EL OBJETO RETORNADO
                    if(!ContratosSaldoProcesado.containsKey(id1)){     //VERIFICO SI EL CONTRATO EN CUESTION YA FUE PROCESADO Y SU CONFIGURACION FUE SALDO CAPITAL
                        Timestamp newFecha= (Timestamp) this.fechaCorte.clone();//HACEMOS LA FECHA DE CORTE UNA VARIABLE LOCAL
                        newFecha.setDate(newFecha.getDate()+DTO.getDuracion());//ADICIONAMOS A LA FECHA DE CORTE EL VALOR DE LA DURACION
                        if(DTO.getSaldocapitalB() ){            //VALIDAMOS SI LA CONFIGURACION DEL FLUJO ES DEL SALDO DE CAPITAL
                            ContratosSaldoProcesado.put(contratos.getID(),true);//ADICIONAMOS EL ID DE CONTRATO AL HASHTABLE QUE GUARDA LOS CONTRATOS CON CONFIGURACION DE SALDO CAPITAL ACTIVO
                            Double newCapital=new Double((((contratos.getSALDOCONTABLE()+contratos.getSALDOMORA())*DTO.getProcentaje())/100));//CALCULAMIOS EL NUEVO CAPITAL
                            GrabarDatos(new Flujos(id1,newFecha.toString(),newCapital,0.0,0.0,1,0, contratos.getIDORIGENDATO()));//GRABAMOS EL NUEVO FLUJO
                        }else if(DTO.getValormoraB()){          //VALIDAMOS SI LA CONFIGURACION DEL FLUJO ES DE LA MORA
                            Double newCapital=new Double(((contratos.getSALDOMORA()*DTO.getProcentaje())/100));//CALCULAMOS EL NUEVO VALOR DE LA MORA
                            GrabarDatos(new Flujos(id1,newFecha.toString(),newCapital,0.0,0.0,1,0, contratos.getIDORIGENDATO()));//GRABAMOS EL NUEVO FLUJO
                        }
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    /**
     * Graba los datos y caculos generados por el escenario.
     * @param fecha - Fecha de generacion de Escenario.
     * @param idmodelo - Modelo sobre el que se genera el Escenario.
     * @throws DatoInvalidoExcepcion Si la fecha o el idmodelo es nulo,
     * @throws SQLException Si se presento un error al conectarse u obtener los datos de la base de datos.
     * @throws NamingException Si se presento un error con JNDI.
     * @throws Exception Si no se pueden encontrar los objetos en el servidor de aplicaciones.
     */
    //@SuppressWarnings("unchecked")
    public void grabarEscenario(Escenarios escenarios,String tabla,boolean finalizar)throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception {
        Integer idEscenario = null;//escenarios.getID();
        ResultSet rs2 = null;
        ResultSet rs3 = null;
        try {
            conn2 = getConexion("METRICADW");
            conn = getConexion("METRICADB");
                        String VACIO = "";
            
            if (conn.getMetaData().getDatabaseProductName().trim().equals("Oracle") ||
               (conn.getMetaData().getDatabaseProductName().trim().equals("MySQL")))   {
                VACIO = ".";
            } else {
                VACIO = "..";
            }
                        
            prep = conn2.prepareStatement("SELECT ID FROM ESCENARIOS WHERE ESTADO=1");
            ResultSet resultado=prep .executeQuery();
            if(resultado.next()){
                idEscenario = resultado.getInt("ID");
                prep.close();
                DatabaseMetaData datos = conn.getMetaData();
                String[] types = {"TABLE"};
                rs = datos.getTables(null, null, "%", types);
                 while (rs.next()) {
                    String element_ = rs.getString(3).toString().toUpperCase().trim();
                    if (tabla!=null && !tabla.trim().equals("") && tabla.toUpperCase().trim().equals(element_)){
                        //verifica en el collection si la tabla se debe procesar
                        System.out.println("Procesando la tabla:"+element_ );
                        st = conn2.createStatement();
                            st.executeUpdate("DELETE FROM "+element_+" WHERE IDESCENARIO="+escenarios.getID());
                            try {st.close();} catch (Exception e) {}

                            String SqlString = "INSERT INTO "+element_+" SELECT "+idEscenario+" AS IDESCENARIO, X.* FROM METRICADB"+VACIO+element_ + " X ";

                            //String SqlString = "INSERT INTO "+element_+" SELECT "+idEscenario+" AS IDESCENARIO, X.* FROM GENERALI_METRICADB"+VACIO+element_ + " X ";
                            prep = conn2.prepareStatement(SqlString);
                            //prep.setInt(1, idEscenario);
                            prep.execute();
                            prep.close();
                            st = conn.createStatement();
                        /*try {
                            int[] resul=prep.executeBatch();
                            conn2.commit();
                            prep.clearBatch();
                            printArray(resul);
                            conn2.setAutoCommit(true);
                        } catch (Exception exception) {
                            try {
                                conn2.rollback();
                            } catch (Exception e) {
                                System.out.println(e);
                            }
                            exception.printStackTrace();
                        }*/
                        break;
                    }
                }


                if(finalizar){
                    ResultSet result1=null;
                    ResultSet result=null;
                    try {
                        pstmt2= conn2.prepareStatement("UPDATE EMPRESAS SET VARDIVERSIFICADO = ?  WHERE ID = ? AND IDESCENARIO = ? AND VARDIVERSIFICADO = 0 ");
                        pstmt3= conn2.prepareStatement("SELECT ID FROM EMPRESAS WHERE IDESCENARIO = ?");
                        pstmt4= conn2.prepareStatement("SELECT ma.TIPO AS TIPO " +
                                "FROM MATRICESCORRELACION ma " +
                                "inner join MODELOS mo on mo.IDMATRIZ=ma.ID " +
                                "inner join ESCENARIOS es on mo.ID=es.IDMODELO " +
                                "where es.ID = ?");
                        pstmt4.setInt(1,idEscenario);
                        result1=pstmt4.executeQuery();
                        Integer tipoMatriz=null;
                        if(result1.next())
                            tipoMatriz=result1.getInt("TIPO");

                        pstmt3.setInt(1,idEscenario);
                        result=pstmt3.executeQuery();
                        while(result.next() && tipoMatriz!=null){
                            Integer id_empresa=result.getInt("ID");
                            if(tipoMatriz.equals(1)){
                                Double varDiversificado=0D;
                                Object obj = (FactoryBasic) Class.forName("ds.Factory386").newInstance();
                                Map<Object,Object> parametros=new HashMap<Object,Object>();
                                parametros.put("DS","ds.Factory386");
                                parametros.put("ID_ESCENARIO",idEscenario);
                                parametros.put("CODIGO_EMPRESA",id_empresa);
                                Object[] data=((FactoryBasic)obj).getData(parametros);
                                for (int i = 0; i < data.length; i++) {
                                    if(data[i] instanceof basic.EncabezadoFormato){
                                        Method[] data1=data[i].getClass().getMethods();
                                        for(int j=0; j < data1.length ; j++){
                                            if(data1[j].getName().equals("getValor"))
                                                varDiversificado+=Double.valueOf(data1[j].invoke(data[i],new Object[0]).toString());
                                        }
                                    }
                                }
                              pstmt2.setDouble(1,varDiversificado);
                              pstmt2.setInt(2,id_empresa);
                              pstmt2.setInt(3,idEscenario);
                              pstmt2.executeUpdate();
                            }
                        }
                    } catch (Exception e) {
                        System.out.println("Error:");
                        e.printStackTrace();
                    }finally{
                        try {pstmt2.close();} catch (Exception e) {}
                        try {pstmt3.close();} catch (Exception e) {}
                        try {pstmt4.close();} catch (Exception e) {}
                        try {result1.close();} catch (Exception e) {}
                        try {result.close();} catch (Exception e) {}
                    }
                    prep = conn2.prepareStatement("UPDATE ESCENARIOS SET ESTADO=2 WHERE ID=?");
                    prep.setInt(1, idEscenario);
                    prep.execute();
                    prep.close();
                    //Guardar el historico de la tabla METRICADW.FACTORESRIESGO Y LA VISTA METRICADW.V_MCH_051
                    //Jchuquen 27-08-2010
                    String SqlString = "";
                    ////Se llena el historico de FACTORESRIESGO
                    SqlString = "INSERT INTO HISFACTORESRIESGO(IDESCENARIO,ID,IDMATRIZ,NOMBRE, " +
                                "POSICION,CAMBIOESPERADO) " +
                                "SELECT ? AS IDESCENARIO,ID,IDMATRIZ,NOMBRE,POSICION,CAMBIOESPERADO " +
                                "FROM FACTORESRIESGO " +
                                "ORDER BY ID";
                    prep = conn2.prepareStatement(SqlString);
                    prep.setInt(1, idEscenario);
                    prep.execute();
                    prep.close();
                    ////Se llena el historico de V_MCH_051
                    SqlString = "INSERT INTO HIS_V_MCH_051(IDESCENARIO,ID_SUBMATRIZ,SUB_MATRIZ,BANDA, " +
                                "CP1,CP2,CP3) " +
                                "SELECT ? AS IDESCENARIO,ID_SUBMATRIZ,SUB_MATRIZ,BANDA,CP1,CP2,CP3 " +
                                "FROM V_MCH_051 " +
                                "ORDER BY ID_SUBMATRIZ,BANDA ";
                    prep = conn2.prepareStatement(SqlString);
                    prep.setInt(1, idEscenario);
                    prep.execute();
                    prep.close();
                    //Fin
                    //this.LimpiarTablas();
                    System.out.println("Fin");
                }
            }else{
                System.out.println("No existe escenarios para salvar");
                throw new LogicaExcepcion("No existe escenarios para salvar");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new LogicaExcepcion("MENSAJE TIPO 10:"+e.toString());
        }finally{
            try {conn.commit();} catch (Exception e) {}
            try {conn2.commit();} catch (Exception e) {}
            try {st.close();} catch (Exception e) {}
            try {rs.close();} catch (Exception e) {}
            try {rs2.close();} catch (Exception e) {}
            try {rs3.close(); } catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
            try {conn2.close();} catch (Exception e) {}
            try {prep.close();} catch (Exception e) {}
        }
    }
    
    private Double getValorTasa(Tasasdepagos  tasasdepagos ){
        try {
            String varSqlSelect="SELECT IDTASA, FECHA, POSICION, VALOR FROM VALORESTASAS " +
                    "WHERE IDTASA= ? AND FECHA <= ? " +
                    "ORDER BY FECHA DESC";
            prep = conn.prepareStatement(varSqlSelect);
            prep.setLong(1,tasasdepagos.getIDTASAREFERENCIA());
            prep.setTimestamp(2,this.fechaCorte);
            rs = prep.executeQuery();
            if(rs.next()){
                Double tasefect = new Double(0);
                tasefect = rs.getDouble("VALOR");
                java.sql.Date fecini = java.sql.Date.valueOf(tasasdepagos.getFECHAINICIO().substring(0, 10).trim());
                java.sql.Date fecfin = java.sql.Date.valueOf(tasasdepagos.getFECHAFIN().substring(0, 10).trim());

                if(!(tasasdepagos.getMODALIDADSPREAD().equals("AV"))){
                    tasefect = Utilfin.Efectiva_to_Nominal(tasefect,tasasdepagos.getMODALIDADSPREAD().trim(),fecini,fecfin);
                }
                
                if(tasasdepagos.getFORMA()==1)
                    tasefect = tasefect + tasasdepagos.getSPREAD();
                else if(tasasdepagos.getFORMA()==2)
                    tasefect = tasefect * tasasdepagos.getSPREAD();
                else if(tasasdepagos.getFORMA()==3)
                    tasefect = ((1 + tasefect) * (1 + tasasdepagos.getSPREAD()) - 1);

                if(!(tasasdepagos.getMODALIDADSPREAD().equals("AV"))){
                     tasefect = Utilfin.Nominal_to_Efectiva(tasefect,tasasdepagos.getMODALIDADSPREAD().trim(),fecini,fecfin);
                }
                
                return tasefect;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {prep.close();} catch (Exception e) {}
            try {rs.close();} catch (Exception e) {}
        }
        println(" MENSAJES TIPO 10:No se encontro el valor de la tasa con id:"+tasasdepagos.getIDTASAREFERENCIA()+" a la fecha:"+fechaCorte);
        return null;
    }
    
    private void validarConFlujosFormulados(Object obj, long idProducto){
        for (ConFlujosFormuladosDTO elem : this.CConFlujosFormulados) {
            if(obj!=null && elem.getProducto().trim().equals(obj.toString().trim())){
                HProductosFormulados.put(elem.getProducto().trim(),idProducto);
            }
        }
    }

    public static Integer getIdEscenario() {
        return IdEscenario;
    }

    /*public static void main(String[] arg) {
        
        String nom1 = "2008-01-01";
        Calendar c = Calendar.getInstance();
        c.setTime(java.sql.Date.valueOf(nom1.substring(0, 10).trim()));
        System.out.println(c.get(Calendar.MONTH));
        if (c.get(Calendar.DAY_OF_MONTH) == 12 && c.get(Calendar.MONTH) == 0 ) {
            c.add(Calendar.DAY_OF_MONTH, 1);
        }
        nom1 = c.get(Calendar.YEAR)+"-"+(c.get(Calendar.MONTH)<=8?"0":"")+(c.get(Calendar.MONTH)+1)+"-"+(c.get(Calendar.DAY_OF_MONTH)<=9?"0":"")+c.get(Calendar.DAY_OF_MONTH);
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
        System.out.println(nom1);

        GregorianCalendar calendar = new GregorianCalendar(1973, 0, 18, 3, 45, 50);
        SimpleDateFormat format = new SimpleDateFormat("E M d hh:mm:ss z yyyy");
        System.out.println("Customized format gives: " + format.format(calendar.getTime()));

    }*/

    public String getLinea(int secuencia, String dir) {
        try {
            DetalleescenarioDAO detalleescenarioDAO = new DetalleescenarioDAO();
            return detalleescenarioDAO.findByIdescenario(secuencia, dir).getContenido();
        } catch (SQLException ex) {
            espera(5);
            //ex.printStackTrace();
            return null;
        } catch (Exception ex) {
            espera(5);
            //ex.printStackTrace();
            return null;
        } catch (Throwable ex) {
            espera(5);
            //ex.printStackTrace();
            return null;
        }
    }
    
    /**
     * Metodo que espera un determinado tiempo segun parametroe
     * @param segundos 
     */
    public void espera(int segundos){
        try{
            Thread.sleep(segundos * 1000);
        } catch (Exception ex) {}        
    }        
}
